对象引用为空-将jQuery数组传递给C#列表

时间:2018-09-08 09:04:02

标签: c# jquery asp.net-mvc

我有一个简单的问题,但它变得复杂。我试图使用jQuery传递对象数组,而在后端,我使用C#来获取列表。所以这是我到目前为止尝试过的:

jQuery

$('#btnStrickOff').on('click', function () {
    var formData = new FormData();
    debugger;
    var rowindexes = $('#jqxgrid').jqxGrid('getselectedrowindexes');

    for (var i = 0; i < rowindexes.length; i++) {

        var row = $('#jqxgrid').jqxGrid('getrowdata', rowindexes[i]);

        formData.append('strData[' + i + '].empno', row.empno);
        formData.append('strData[' + i + '].Name', row.Name);
        formData.append('strData[' + i + '].Des', row.Des);
        formData.append('strData[' + i + '].Dept', row.Dept);
        formData.append('strData[' + i + '].Section', row.Section);

        formData.append('strData[' + i + '].Emp_type', row.Emp_type);
        formData.append('strData[' + i + '].LateAtt', row.LateAtt);
        formData.append('strData[' + i + '].Diff', row.Diff);
    }

    var url = '@Url.Action("InsertStrikeOff")';

    debugger;

    $.ajax({
        type: 'POST',
        url: url,
        dataType: 'json',
        data: JSON.stringify({ 'things': formData }),
        contentType: false,
        processData: false,
        async: false,
        success: function (data) {
            alert("Updated. - "+data);
        }
    });
});

因此,思路是:有一个表,并且每行都有一个与之关联的CheckBox。每当用户检查一行或多行时,都应将行数据放在Array中并进行迭代,然后在Ajax调用中传递给C#控制器。这是C#代码部分:

C#

public JsonResult InsertStrikeOff(List<DailyStrikeOffBO> things)
{
   DateTime strikeDate = DateTime.Now;
   var value = (dynamic)null;
   foreach (var item in things)
   {
      bool chk = Facede.StrikeOff.CheckStrikeOff(item.empno);

      if (chk == false)
      {
         bool aStrikeOffBo = Facede.StrikeOff.InserstrikeOffLst2(item.empno, item.Name, item.LateAtt, strikeDate, item.remarks);
         value = "<div style='color:green;'>Striked-off request sent!</div>";
      }
      else
      {
         value = "<div style='color:red;'>Already striked off!</div>";
      }
   }

  return Json(value, JsonRequestBehavior.AllowGet);
}

不幸的是,每次我调用C#控制器时都会遇到此错误,尽管我相当确定我做对了-对象引用未设置为对象的实例。我在这里错过了什么吗?

更新1 :模型

public class DailyStrikeOffBO
{
    public string empno { get; set; }
    public string Name { get; set; }
    public string Des { get; set; }
    public string Dept { get; set; }
    public string Section { get; set; }
    public string Emp_type { get; set; }
    public string Diff { get; set; }
    public string LateAtt { get; set; }
}

更新2

Sample Image

2 个答案:

答案 0 :(得分:1)

您不能发布包含FormData的对象-您需要发送实际的FormData对象。另外,您的name与要发布到的模型(该集合是集合,而不是包含集合的对象)不匹配。

假设DailyStrikeOffBO包含属性empnoName, Des等,那么您需要将名称/值对附加为

formData.append('[' + i + '].empno', row.empno);
formData.append('[' + i + '].Name', row.Name);
formData.append('[' + i + '].Des', row.Des);
.... // etc

,然后将ajax选项修改为

$.ajax({
    type: 'POST',
    url: url,
    dataType: 'json',
    data: formData , // modify
    contentType: false,
    processData: false,
    async: false,
    success: function (data) {
        alert("Updated. - "+data);
    }
});

答案 1 :(得分:0)

for (a = 0; a < rowindexes.length; a++) {
            var row = $('#jqxgrid').jqxGrid('getrowdata', rowindexes[i]);
                var model = {
                    empno : row.empno,
                    Name: row.Name,                    
                    Des: row.Des,
                    Dept: row.Dept,
                    Section: row.Section,
                    Emp_type:  row.Emp_type,
                    Diff: row.Diff,
                    LateAtt: row.LateAtt
                };

                data.push(model);
            }   
var modelString = JSON.stringify(data);
    $.ajax({
        type: 'POST',
        url: url,
        dataType: 'json',
        data: modelString ,
        contentType: "application/json; charset=utf-8",
        processData: false,       
        success: function (data) {
            alert("Updated. - "+data);
        }
    });

请尝试使用json对象,而不是使用FormData。 通过ajax(data:JSON.stringify({'things':formData}),)传递数据的方式也不正确。

尝试上面的代码,让我知道它的运行方式。