我有一个使用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) { ... });
}
在这种情况下,我的应用程序不再崩溃" interally" MVC框架尝试自行反序列化对象的位置。现在它绕过所有这些并直接调用我的控制器中的方法。有点hacky,但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
?
答案 0 :(得分:2)
我认为您需要发送一个FormData object而不仅仅是一个字符串。尝试更改AjaxRequest
功能,如下所示:
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";
var form = new FormData();
form.append("MyData", JSON.stringify(data));
$.ajax({processData: false, async: args.async, cache: args.cache, data: form, dataType: dataType, type: type, url: url, contentType: contentType, traditional: true, headers : { ... }, beforeSend: { ... }, success: { ... }, error: { ... }, complete: { ...});
}