【问题标题】:Trouble posting form data to MVC4 controller action method using jQuery使用 jQuery 将表单数据发布到 MVC4 控制器操作方法时遇到问题
【发布时间】:2013-05-07 20:04:48
【问题描述】:

我有一个带有 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

没有问题。

【问题讨论】:

  • 试试参数是否可以为空(Guid?reportid, Guid?assessmentid...
  • Guid 永远不会为空。

标签: c# jquery json asp.net-mvc-4


【解决方案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);
    }
});

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 当我发送一个包含换行符和特殊字符的字符串时,我需要进行字符串化。
    • jQuery 会将其转换为正确的键值对并对内容进行编码。 Stringify 将 JavaScript 对象转换为 JSON 字符串文字表示。
    • 所以不应该 $.ajax({ type: "POST", dataType: "json", data: { reportid: data["reportid"] }, contentType: "application/json; charset=utf -8", url: "/Assessments/ModifyAssessmentTemplateText", 成功: function (data) { lastModified = data["LastModified"]; updateLastModified(lastModified); } });工作吗?
    • ELMAH 的错误是:System.ArgumentException:无效的 JSON 原语:reportid。
    • 当然因为它不能将 JSON 字符串绑定到您的任何参数。 dataType:'json',指的是你的服务器返回的数据类型。保留所有内容,只需删除 JSON.stringify。
    【解决方案3】:

    所以我设法在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 时将不受阻碍。

    【讨论】:

    • 但这与他的示例相同,因为 JSON.Stringify 将对象转换为 JSON 字符串。
    • 当我做 JSON.stringify 虽然由于某种原因它没有工作,不知道为什么。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      如果您尝试以json 发送数据。你应该知道:

      Specifying the Data Type for AJAX Requests

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

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

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

      【讨论】:

      • 感谢您的提示。但是,即使添加了所有内容,它也无济于事。 $.ajax({ type: "POST", dataType: "json", data: { reportid: data["reportid"] }, contentType: "application/json; charset=utf-8", url: "/Assessments/ ModifyAssessmentTemplateText", 成功: function (data) { lastModified = data["LastModified"]; updateLastModified(lastModified); } });
      • @pendraggon87 为发布的数据创建模型对象并发送所有字段。然后向我们显示错误消息。
      • 我试图避免为此创建对象模型的开销。似乎很奇怪,如果我可以通过 url 发送它,它可以工作,但如果我通过正文(数据)发送它就不行。 GUID 是函数进行几次查找并确定是否应该执行修改所必需的
      猜你喜欢
      • 2017-08-24
      • 1970-01-01
      • 2012-05-06
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多