为什么使用www-form-urlencoded发送时,我的JSON字符串在服务器端为空
本文关键字:字符串 JSON 服务器端 我的 www-form-urlencoded 为什么 | 更新日期: 2023-09-27 18:13:09
我有一个ASP。. NET/MVC4应用程序,使用jquery/ajax。
我正在尝试使用$.ajax( ... )
从客户端发送一个非常大的字符串到服务器
首先,我们使用contentType "application/json"
来完成这个工作。然而,在这种特殊情况下,服务器抛出异常,因为正在传输的数据太长。我已经尝试了绝对的一切,以增加maxJsonLength
的反序列化在网络。但是它不工作,没有人知道为什么。
有人建议,作为一个工作,发送contentType作为"application/x-www-form-urlencoded; charset=UTF-8"
,然后让我的控制器手动反序列化对象,而不是让MVC框架做它。
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框架试图反序列化自己的对象。现在它绕过所有这些,直接调用控制器中的方法。虽然有点俗气,但三天后我会尽我所能。
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();
之前,我在返回"string"
的控制台中键入typeof(data)
。如果我把鼠标放在符号上,我可以看到我期望它包含的所有数据都在那里。那么为什么在我的c#代码中,值是null
呢?
我认为你需要发送一个FormData对象,而不仅仅是一个字符串。试着像这样改变你的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: { ...});
}