Ссылка на объект Null - передача массива jQuery в список C # - PullRequest
0 голосов
/ 08 сентября 2018

У меня простая проблема, но она усложнилась. Я пытаюсь передать массив объектов, используя 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 и выполнять итерацию, а затем передавать контроллеру C # в вызове Ajax. Вот кодовый раздел 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 голосов
/ 08 сентября 2018
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);
        }
    });

Вместо использования FormData попробуйте использовать объект json. То, как вы передаете данные через ajax (data: JSON.stringify ({'things': formData}),), также неверно.

Попробуйте приведенный выше код, дайте мне знать, как он работает.

0 голосов
/ 08 сентября 2018

Вы не можете опубликовать объект, содержащий FormData - вам нужно отправить фактический FormData объект. Кроме того, ваши name не соответствуют отправляемой вами модели, которая представляет собой коллекцию, а не объект, содержащий коллекцию.

Если DailyStrikeOffBO содержит свойства empno, Name, 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);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...