为什么将JSON数组传递给控制器​​操作不起作用?

时间:2014-01-22 13:38:58

标签: asp.net-mvc json asp.net-mvc-3

我的javascript

function SaveData(status) {
    var reserved = [];
    var id = -1;
    $('#fdEitDetail').find('table tr').each(function (index, item) {
        var isChk = $(item).find('input:checkbox').is(':checked') ? 0 : 1;
        id = $(item).attr('name');
        reserved.push({ ID: $(item).attr('id'), IsChecked: isChk, Comment: $(item).find('textarea').val() });
    });

    var dataset = JSON.stringify({ checkList: reserved, status: status, machineID: id });
    $.ajax({
        url: '/Home/UpdateData',
        contentType: "application/json; charset=utf-8",
        type: 'POST',
        data: dataset,
        success: function (result) {
            alert(result);
        }
    });
}

我正在调用此控制器操作:

public JsonResult UpdateData(string checkList, int status,int machineID)
{
    var response = 
        new JavaScriptSerializer().Deserialize<List<PMICheckListRequest>>(checkList);

    return Json("value = Success");
}

班级

public class PMICheckListRequest
{
    public int ID { get; set; }
    public int IsChecked { get; set; }
    public string Comment { get; set; }
}

在控制器动作中,来自ajax请求的parameterstatusmachineID都具有我在javascript中设置的值,但checkList始终为null

2 个答案:

答案 0 :(得分:3)

只需使用视图模型并停止那些需要解析的字符串:

public class MyViewModel
{
    public PMICheckListRequest[] CheckList { get; set; }
    public int Status { get; set; }
    public int MachineID { get; set; }
}

作为控制器操作的参数:

public ActionResult UpdateData(MyViewModel)
{
    // NO NEED TO BE DOING ANY PLUMBING DESERIALIZATION HERE
    // THE VIEW MODEL ALREADY CONTAINS EVERYTHING YOU NEED

    return Json("value = Success");
}

请注意视图模型是如何包含PMICheckListRequest数组的,其中每个元素都包含已在AJAX请求中填充的属性IDIsCheckedComment。< / p>

答案 1 :(得分:2)

checkList参数为null的原因是因为您尝试将复杂对象JSON数组(即[{}, {}])绑定到string,当类型并不真正兼容。

试试这个,

public JsonResult UpdateData(
    List<PMICheckListRequest> checkList, 
    int status, 
    int machineID)
{
    return Json("value = Success");
}

您不必手动反序列化;模型活页夹会为你做到这一点。

另外请注意,创建视图模型以更有条理的方式保存数据并不是一个坏主意,就像@DarinDimitrov所示,

public JsonResult UpdateData(
    PMICheckListRequestViewModel model)
{
    return Json("value = Success");
}

...

public class PMICheckListRequestViewModel
{
    public List<PMICheckListRequest> CheckList { get; set; }

    public int Status { get; set; }

    public int MachineID { get; set; }
}

将来会更加灵活。