【发布时间】:2023-03-26 16:02:02
【问题描述】:
我有一个使用 jquery / ajax 的 ASP.NET / MVC4 应用程序。
我正在尝试使用 $.ajax( ... ) 将一个非常大的字符串从客户端发送到服务器
首先,我们使用 contentType "application/json" 来完美运行。然而,在这种特殊情况下,服务器会抛出异常,因为正在传输的数据太长。我已经尝试了所有方法来增加 web.config 文件中反序列化程序的 maxJsonLength,但它不起作用,没有人能弄清楚原因。
有人建议,作为一种变通方法,将 contentType 发送为 "application/x-www-form-urlencoded; charset=UTF-8",然后让我的控制器手动反序列化对象,而不是让 MVC 框架去做。
Javascript:
function AjaxRequest(data, dataType, type, url, contentType, success, error, args)
{
if (url.indexOf("MyController/SomeMethodInMyController") > 0)
contentType = "application/x-www-form-urlencoded; charset=UTF-8";
data = JSON.stringify(data);
$.ajax({async: args.async, cache: args.cache, data: data, dataType: dataType, type: type, url: url, contentType: contentType, traditional: true, headers : { ... }, beforeSend: { ... }, success: { ... }, error: { ... }, complete: { ...});
}
function SomeFunction()
{
var object = {};
object.Name = $("#someControl").val();
object.RtfData = $("someOtherControl").val();
AjaxRequest(object, 'html', 'post', 'MyController/SomeMethodInMyController', 'application/json;', function (response) { ... }, function (error) { ... });
}
在这种情况下,我的应用程序不再在 MVC 框架尝试自行反序列化对象的“内部”崩溃。现在它绕过了所有这些,直接调用了我的控制器中的方法。有点老套,但 3 天后我会尽我所能。
C#:
public void SomeMethodInMyController(string formData)
{
JavaScriptSerializer jss = new JavaScriptSerializer();
jss.MaxJsonLenght = int.MaxValue;
MyType objMyType = jss.Deserialize<MyType>(formData);
//do stuff with objMyType
}
问题是当我在这个方法中设置断点时,formData 是null。
在我的浏览器控制台中,在实际执行$.ajax(); 之前,我将typeof(data) 输入到返回"string" 的控制台中。如果我将鼠标悬停在符号上,我可以看到我希望它包含的所有数据都在那里。那么为什么在我的 C# 代码中值是null?
【问题讨论】: