Asp.Net 将大量数据从视图发送到控制器
Posted
技术标签:
【中文标题】Asp.Net 将大量数据从视图发送到控制器【英文标题】:Asp.Net Sending large amounts of data from view to controller 【发布时间】:2014-09-12 07:04:43 【问题描述】:我正在开发一个 Asp.net MVC 应用程序。在我的项目中,我使用了一个名为 Dhtmlx Scheduler 的第三方 javascript 库。
这个库中有一个函数,然后将调度器上的所有数据写入XML格式。
然后我需要处理这些数据,并在我的视图页面上写回<textarea>
。
到目前为止,这就是我所拥有的:
查看:
function save()
var url = "/Home/Save"
var xml = scheduler.toXML();
$.ajax(
url: url,
Type: "POST",
dataType: 'json',
async: false,
data: xmlString: xml ,
contentType: 'application/json; charset=utf-8',
success: alert("File Saved in C:\\ Drive as Tasks.xml")
);
控制器:
public ActionResult Save(string xmlString)
XmlDocument doc = new XmlDocument();
try
doc.LoadXml(xmlString);
catch(Exception e)
Console.WriteLine(e);
doc.Save(@"C:\\Tasks.xml");
W6ViewModel viewModel = new W6ViewModel();
viewModel.engineers = db.W6ENGINEERS.ToList();
viewModel.tasks = db.W6TASKS.ToList();
viewModel.skills = db.W6TASKS_REQUIRED_SKILLS1.ToList();
viewModel.categories = db.W6TASKTYPECATEGORY.ToList();
gatherInfo(viewModel);
return View("Index", viewModel);
当尝试保存三个事件(Dhtmlx 对象)时,它可以完美运行,当尝试向 XML 添加更多数据时,我收到此错误(从 FireBug 读取):
此请求的查询字符串长度超过了配置的 maxQueryStringLength 值。
任何帮助将不胜感激。 谢谢!
Firebug 控制台:
【问题讨论】:
你是在用 FireBug 模拟 POST 吗? 你看过here 在萤火虫中 - json 是在正文请求中发送的吗?如果是,您应该尝试直接从请求Stream
获取正文内容,而不是通过活页夹。
@pwas 和我本质上要问的是:数据是如何发送到您的控制器的?您的错误表明它是作为查询字符串而不是 HTTP POST 正文内容发送的。
这就是问题所在 - 您正在制作 GET
而不是 POST
。首先,将$.ajax
中的Type
改为type
。其次,将HttpPost
属性添加到您的操作中。如果没有这个,操作将仅适用于 GET
请求。
【参考方案1】:
我相信 jQuery.ajax 使用 type
而不是 Type
。这是区分大小写的。如果您查看您的 Firebug,它正在执行 GET 请求而不是 POST:
$.ajax(
url: url,
Type: "POST",
dataType: 'json',
async: false,
data: xmlString: xml ,
contentType: 'application/json; charset=utf-8',
success: alert("File Saved in C:\\ Drive as Tasks.xml")
);
应该是
$.ajax(
url: url,
type: "POST",
dataType: 'json',
async: false,
data: xmlString: xml ,
contentType: 'application/json; charset=utf-8',
success: alert("File Saved in C:\\ Drive as Tasks.xml")
);
【讨论】:
非常重要:控制器的动作应该用HttpPost
属性修饰 - 否则只会对GET
请求可见。
@pwas 如果你不装饰控制器,它可以是 POST 或 GET(可能是事件 DELETE、PUT 等)。但是,如果他用HttpPost
装饰它,他会得到一个 404 并且问题可能更容易识别。
@Dismissile:我认为默认值是HttpGET
@malkam 我刚刚编写了一个快速演示程序来证明这一点,如果您不在 MVC 中的操作方法上使用任何属性,那么它将接受 GET 或 POST。
@malkam 实际上并没有这样的默认值,但是添加属性会将其限制为仅使用该方法。【参考方案2】:
Grr 我还不能评论,我似乎记得你是否传递了一个原始值
data: xml
而不是
data : xmlString: xml
【讨论】:
很遗憾,这并没有解决我的问题,我之前也遇到过这样的问题,因此 xml 将映射到 Action 变量。 现在控制器用 [HttpPost] 修饰使用 public ActionResult Save([FromBody] string xmlString) 使用 [FromBody] 但使用 data: "" : xml 它在某处!前段时间遇到这个问题时绞尽脑汁 感谢您的帮助!但我尝试了 "" : xml 的原始和您的建议仍然没有结果。 data = "'xmlString':'" + xml + "' " 如果没有帮助,那么该喝茶了,我去拿帽子和外套。【参考方案3】:在这篇文章中有解释-> request exceeds the configured maxQueryStringLength when using [Authorize]
您应该更改 web.config 中的配置设置,以允许超过默认值的 2048 字符。
所以基本上你需要改变
<httpRuntime maxRequestLength = "" maxQueryStringLength ="">
到您认为可以接受的数字。
编辑:您是否尝试将您的 Type: "POST"
更改为 type: "POST"
?
因为 javascript 是区分大小写的语言。
至于无效的 Json 原语试试这个:
$.ajax(
url: url,
type: "POST",
dataType: 'json',
async: false,
data: 'xmlString='+ xml,
contentType: 'application/json; charset=utf-8',
success: alert("File Saved in C:\\ Drive as Tasks.xml")
);
【讨论】:
这可能是一个非常糟糕的主意。代码应该将数据放在 POST 正文中,而不是放在查询字符串中。 这确实解决了问题,但我担心这不是向服务器发送大量信息的最佳方式。还有其他发送数据的方式吗? 是的,虽然我发布的方法应该让您运行,但在其他地方的代码中主要存在问题,该代码获取发布数据并将其转换为查询字符串。 是的,确切地说,到目前为止,我不知道有更好的方法来处理这种情况。 我们可以查看您的路线配置吗?请以上是关于Asp.Net 将大量数据从视图发送到控制器的主要内容,如果未能解决你的问题,请参考以下文章
将 JSON 从视图发送到控制器 ASP.NET MVC 会给出空值
ASP.Net MVC 将数据从视图传递到不同文件夹中的控制器
从控制器事件(无客户端请求)向视图发送数据 ASP.NET MVC 4