1

这是我的 jQuery,它查看一个 HTML 表并从 tr 和一个输入字段值中获取一个 id,并将它们放入一个对象中,以进行 json 字符串化并发布到 MVC 控制器。我正在使用 jQuery 1.8.2

      var rowdata = [];
            $('table').find('tr').each(function () {
                myjson = [];
                item = {}
                item["id"] = $(this).attr('id');
                item["reason"] = $(this).find('input').val();
                myjson.push(item);
                rowdata.push(myjson);
            });
            jsonstring = JSON.stringify(rowdata);
            $.ajax({
                url: '@Url.Action("AbsentReason", "Attendance")',
                data: jsonstring,
                type: 'POST',
                traditional: true,
                contentType: 'json',
                success: function (data) {
                    $('#message').html("Reason was updated");
                }
            });

这是检查有效的结果 JSON。

[[{}],[{"id":"6","re​​ason":""}],[{"id":"7","re​​ason":""}],[{"id": "15","re​​ason":""}],[{"id":"23","re​​ason":""}],[{"id":"29","re​​ason":""}] ,[{"id":"30","re​​ason":""}],[{"id":"31","re​​ason":""}],[{"id":"35","原因":""}],[{"id":"40","re​​ason":""}],[{"id":"41","re​​ason":""}],[{"id ":"42","re​​ason":""}],[{"id":"48","re​​ason":""}],[{"id":"49","re​​ason":""}],[{"id":"50","re​​ason":""}],[{"id":"51","re​​ason":""}],[{"id":"52" ,"reason":""}],[{"id":"53","re​​ason":""}],[{"id":"54","re​​ason":""}],[{ "id":"55","re​​ason":""}],[{"id":"56","re​​ason":""}],[{"id":"57","re​​ason": ""}],[{"id":"58","re​​ason":""}],[{"id":"59","re​​ason":""}],[{"id":" 60","re​​ason":""}],[{"id":"61","re​​ason":""}],[{"id":"62","re​​ason":""}],[{"id":"63","re​​ason":""}],[{"id":"74","re​​ason":""}],[{"id":"75" ,"reason":""}],[{"id":"80","re​​ason":""}],[{"id":"81","re​​ason":""}],[{ "id":"87","re​​ason":""}],[{"id":"88","re​​ason":""}],[{"id":"90","re​​ason": ""}],[{"id":"91","re​​ason":""}],[{"id":"105","re​​ason":""}],[{"id":" 106","re​​ason":""}],[{"id":"107","re​​ason":""}],[{"id":"108","re​​ason":""}],[{"id":"110","re​​ason":""}],[{"id":"111","re​​ason":""}],[{"id":"119 “,“原因”:””}]]:

这是我的控制器的开始。

 [HttpPost]
    public ActionResult AbsentReason(string jsonstring)
    {            
        return View("Index");
    }

jsonstring 参数始终为空。任何人都可以看到有什么问题吗?

更新

这是我根据评论使用模型并允许 MVC 为我完成工作的新控制器。

 [HttpPost]
    public ActionResult AbsentReason(IEnumerable<VMAttendance> jsonstring)
    {            
        return View("Index");
    }

和我的视图模型

public class VMAttendance
{
    public int PersonID
    {
        get;
        set;
    }
    public string Reason
    {
        get;
        set;
    }
}

该参数仍然为空。我还更新了我的 jQuery 以尝试发送正确的 json。

   var data = $('table').find('tr').map(function () {
                var id = $(this).attr('id');
                var reason = $(this).find('input').val();

                var rowdata = { "PersonID": id, "Reason": reason };
                return rowdata;
            }).get();


            $.ajax({
                url: '@Url.Action("AbsentReason", "Attendance")',
                data: data,
                type: 'POST',
                traditional: true,
                contentType: 'json',
                success: function (data) {
                    $('#message').html("Reason was updated");
                }
            });

我试图向控制器发送一些测试 json,但参数仍然为空。

var data = '{"PersonID":"6","Reason":""},{"PersonID":"7","Reason":""}'
4

3 回答 3

3

假设你有一个 MVC 模型如下

public class MyModel
{
   public int ID {get;set;}
   public string Reason {get;set;}
}

如果您将操作方法​​签名修改为

public ActionResult AbsentReason(IEnumerable<MyModel> json)

当您回发您的 json 对象时,json 序列化程序会将您的 json 反序列化为 MyModel 的 IEnumerable。

于 2013-11-12T22:23:19.147 回答
3

我通过将 contentType 从 'json' 更改为 'application/json; charset=utf-8' 并删除我的 json 中的第一个空对象,该对象是从表头中的额外 tr 创建的。json看起来像

[{},{"PersonID":"6","Reason":""},{"PersonID":"7","Reason":""}]

当它看起来像这样

[{"PersonID":"6","Reason":""},{"PersonID":"7","Reason":""}]

我的控制器看起来像这样,效果很好。

  [HttpPost]
    public ActionResult AbsentReason(IEnumerable<VMAttendance> jsonstring)
    {            
        return View("Index");
    }

感谢杜伊的帮助!

于 2013-11-13T14:02:52.407 回答
1

将 ajax 对象中的 contentType 更改为字符串。

我很好奇为什么你想把你的 json 当作字符串而不是对象。通常我会有一个 C# 视图模型并让序列化程序将 json 对象映射到我的控制器中的那个 C# 视图模型

于 2013-11-12T03:12:36.563 回答