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

时间:2016-10-13 18:27:53

标签: c# asp.net json ajax

我有一个使用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
}

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

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

1 个答案:

答案 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: { ...});
}