为什么使用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框架做它。

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框架试图反序列化自己的对象。现在它绕过所有这些,直接调用控制器中的方法。虽然有点俗气,但三天后我会尽我所能。

c#:

public void SomeMethodInMyController(string formData)
{
    JavaScriptSerializer jss = new JavaScriptSerializer();
    jss.MaxJsonLenght = int.MaxValue;
    MyType objMyType = jss.Deserialize<MyType>(formData);
    //do stuff with objMyType
}

问题是,当我在这个方法中设置一个断点时,formDatanull

在浏览器的控制台中,在实际执行$.ajax();之前,我在返回"string"的控制台中键入typeof(data)。如果我把鼠标放在符号上,我可以看到我期望它包含的所有数据都在那里。那么为什么在我的c#代码中,值是null呢?

为什么使用www-form-urlencoded发送时,我的JSON字符串在服务器端为空

我认为你需要发送一个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: { ...});
}