当前位置: 首页 > 知识库问答 >
问题:

为什么我的JSON字符串在使用www表单URL编码发送时在服务器端为空?

顾英发
2023-03-14

我有一个ASP。NET/MVC4应用程序,该应用程序使用jquery/ajax。

我正试图使用$将一个非常大的字符串从客户端发送到服务器。ajax(…)

我们主要使用contentType“application/json”来实现这一点,这一点非常有效。但是,在这一特定情况下,服务器会抛出异常,因为传输的数据太长。我已经尽了一切努力来增加web中反序列化程序的maxJsonLength。配置文件,但它不工作,没有人能找出原因。

有人建议,作为一种解决方案,将内容类型发送为"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
}

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

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


共有1个答案

云默
2023-03-14

我认为您需要发送一个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: { ...});
}
 类似资料:
  • 我试图将JSON作为字符串(而不是对象)发送到服务器(在本例中,它是一个WebAPI)。我总是得到一个错误代码500。 当请求被获取时,我成功地从服务器获得响应,并且没有向服务器发送数据。这是通过JsonObjectRequest实现的。 现在,我尝试发送一个以JSON作为字符串的POST请求。为此,我尽力了 JSONObject请求 StringRequest GsonRequest JsonR

  • 问题内容: 例如,如果我输入URL: http://www.foo.com/page.php?parameter=kickme#MOREURL 然后在服务器上没有任何部分:#MOREURL 是否可以在没有jQuery AJAX的情况下将这些部分发送或获取到服务器? 问题答案: 不,它仅对浏览器可用 ,因此您必须使用Javascript处理它。服务器无法读取它。 说明: 基本上,页面URL的散列部分

  • 问题内容: 我正在我的应用程序中实现Google的即时搜索。当用户在文本输入中键入内容时,我想触发HTTP请求。我遇到的唯一问题是,当用户到达名字和姓氏之间的空格时,该空格未编码为,从而破坏了搜索。如何用替换空格,或者仅安全地对字符串进行URL编码? 问题答案: 尝试encodeURIComponent。 通过用表示字符的UTF-8编码的一个,两个,三个或四个转义序列替换某些字符的每个实例,对统一

  • 问题内容: 一些API(例如paypal API) 在JSON中使用字符串类型表示十进制数字。所以代替。 为什么/何时使用json数字值类型是个好主意?AFAIK数字值类型允许无限精度和科学计数法。 问题答案: 将JSON中的数字值作为字符串传输的主要原因是为了消除传输中的精度或歧义性。 的确,JSON规范未指定数字值的精度。这并不意味着JSON数字具有无限的精度。这意味着未指定数值精度,这意味着

  • 我在研究Xamarin。Android应用。我必须使用内容类型为x-www-form-urlencoded的rest API。我无法成功调用Rest API,在此之前,我使用了许多web服务,但我第一次使用这种类型的API。我被困在这里面了。我尝试了两种方法来消耗它: 下一个问题是:

  • 我知道这个问题在这里已经被问了无数次了,我已经搜索了SO和其他来源来寻找解决方法,但我就是无法解决这个错误。我的ClientPlayer类属性有一个getter和setter,当某个按钮被调用时setter在GUI中被调用,我希望在客户端连接对象并将对象发送到服务器后使用getter。调用方法“This.client.SendTCP(ClientPlayer.GetPlayerName());”返