1

我有一个带有 textarea 的表单,在尝试发送信息时,我使用的是 JSON.stringify,但出现错误。这是代码:

        $.ajax({
            type: "POST",
            dataType: "json",
            data: JSON.stringify({
                reportid: data["reportid"], //Guid
                assessmentId: data["assessmentId"], //Guid
                title: data["title"], //string
                body: data["body"], //string
                section: data["section"], //string
                reportsection: data["reportSection"] //string
            }),
            url: "/Assessments/ModifyAssessmentTemplateText",
            success: function (data) {
                lastModified = data["LastModified"];
                updateLastModified(lastModified);
                alert(data);
            }
        });

我的控制器方法设置如下:

[POST("ModifyAssessmentTemplateText")]
[AjaxOnly]
public JsonResult ModifyAssessmentTemplateText(Guid reportid, Guid assessmentid, string title, string body, string section, string reportSection)
{
//...
}

我收到 500 服务器错误。

我知道当我尝试测试并且只有一个参数reportid 并且让我的方法接受一个字符串时,它起作用了。但是当我将它设置为 Guid 时,我得到了 500 错误。有没有办法解析 JSON 服务器端?

编辑:

注意:当我不使用数据时,我会使用 url: "/Assessments/ModifyAssessmentTemplateText?reportid=" + reportid

它没有问题。

4

5 回答 5

1

所以我设法在http://encosia.com/asmx-scriptservice-mistake-invalid-json-primitive/上找到了答案。本质上,我需要做的是将 JSON 字符串封装在引号中。这使得字符串成为 JSON 字符串而不是 JavaScript 对象文字。

引用自网站:

The solution is as simple as two single-quotes:
// RIGHT
$.ajax({
  type: 'POST',
  contentType: 'application/json',
  dataType: 'json',
  url: 'WebService.asmx/Hello',
  data: '{ FirstName: "Dave", LastName: "Ward" }'
});

你发现区别了吗?data 参数现在是 JSON 字符串,而不是 JavaScript 对象文字。差异是微妙的,但有助于理解。由于它是一个字符串,jQuery 不会尝试执行任何进一步的转换,并且 JSON 字符串在传递给 ASMX ScriptService 时将不受阻碍。

于 2013-05-07T20:32:56.120 回答
1

我认为到目前为止的答案都围绕着这一点跳舞。您的数据根本不必是字符串,您尝试过吗?

$.ajax({
    type: "POST",
    dataType: "json",
    data: {
        reportid: data["reportid"], //Guid
        assessmentId: data["assessmentId"], //Guid
        title: data["title"], //string
        body: data["body"], //string
        section: data["section"], //string
        reportsection: data["reportSection"] //string
    },
    url: "/Assessments/ModifyAssessmentTemplateText",
    success: function (data) {
        lastModified = data["LastModified"];
        updateLastModified(lastModified);
        alert(data);
    }
});
于 2013-05-17T16:44:59.823 回答
1

您不必调用JSON.stringify,因为您需要参数,因此它应该是键值对并且您正在尝试 POST JSON 对象。

您可以创建匹配 JavaScript 对象的参数然后使用JSON.stringify,这样模型绑定器将尝试将其反序列化到对象中。

于 2013-05-07T20:09:09.457 回答
0

如果您尝试将数据发送为json. 你应该知道:

指定 AJAX 请求的数据类型

json- 将响应评估为 JSON 并将 JavaScript 对象发送到成功回调。

但是 binder 如何检测到它是json request

经过contentType: 'application/json; charset=utf-8'

于 2013-05-07T20:18:08.517 回答
0

您是否尝试过将 guid 作为字符串发布并在服务器上解析出 Guid?

于 2013-05-07T20:10:45.710 回答