发布到MVC Controller的JSON为null

时间:2013-11-12 02:41:34

标签: json asp.net-mvc-4

这是我的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”, “理由”: “”}],[{ “ID”: “7”, “理由”: “”}],[{” ID “:” 15" , “理由”: “”}],[{ “ID”: “23”, “理由”: “”}],[{ “ID”: “29”, “理由”:” “}],[{” ID “:” 30" , “理由”: “”}],[{ “ID”: “31”, “理由”: “”}],[{ “ID”:“35 ”, “理由”: “”}],[{ “ID”: “40”, “理由”: “”}],[{ “ID”: “41”, “理由”: “”}],[ { “ID”: “42”, “理由”: “”}],[{ “ID”: “48”, “理由”: “”}],[{ “ID”: “49”, “理由” : “”}],[{ “ID”: “50”, “理由”: “”}],[{ “ID”: “51”, “理由”: “”}],[{ “ID”: “52”, “理由”: “”}],[{ “ID”: “53”, “理由”: “”}],[{ “ID”: “54”, “理由”: “”}] ,[{ “ID”: “55”, “理由”: “”}],[{ “ID”: “56”, “理由”: “”}],[{ “ID”: “57”,”原因 “:” “}],[{” ID “:” 58" , “理由”: “”}],[{ “ID”: “59”, “理由”: “”}],[{“编码“:” 60" , “理由”: “”}],[{ “ID”: “61”, “理由”: “”}],[{ “ID”: “62”, “理由”: “” }],[{ “ID”: “63”, “理由”: “”}],[{ “ID”: “74”, “理由”: “”}],[{ “ID”: “75” “原因”: “”}],[{ “ID”: “80”, “理由”: “”}],[{ “ID”: “81”, “理由”: “”}],[{ “ID”: “87”, “理由”: “”}],[{ “ID”: “88”, “理由”: “”}],[{ “ID”: “90”, “理由”: “”}],[{ “ID”: “91”, “理由”: “”}],[{ “ID”: “105”, “理由”: “”}],[{ “ID”:” 106" , “理由”: “”}],[{ “ID”: “107”, “理由”: “”}],[{ “ID”: “108”, “理由”: “”}],[{ “ID”: “110”, “理由”: “”}],[{ “ID”: “111”, “理由”: “”}],[{ “ID”: “119”, “理由”: “”}]]:

这是我的控制器的开始。

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

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

更新

这是我的新控制器,基于评论使用模型并允许MVC为我工作。

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

和我的viewmodel

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":""}'

3 个答案:

答案 0 :(得分:3)

假设你有一个MVC模型如下

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

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

public ActionResult AbsentReason(IEnumerable<MyModel> json)

当你回发你的json对象时,json序列化器会将你的json反序列化为一个IEnumerable的MyModel。

答案 1 :(得分: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");
    }

感谢Duy的帮助!

答案 2 :(得分:1)

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

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