2013-11-12 2 views
1

Вот мой jQuery, который смотрит на таблицу HTML и получает идентификатор из значения tr и значения ввода и помещает их в объект, который должен быть сжат json и отправлен в контроллер MVC. Я использую jQuery 1.8.2JSON отправлен в MVC Controller is null

 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", "reason": ""}], [{"id": "7", "reason": ""}], [{ "идентификатор": "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": "REA "90" сын ":" "}], [{" ID ":" 91" , "причина": ""}], [{ "ID": "105", "причина": ""}], [{ "ID ":" 106" , "причина": ""}], [{ "ID": "107", "причина": ""}], [{ "ID": "108", "причина": "" }], [{ "ID": "110", "причина": ""}], [{ "ID": "111", "причина": ""}], [{ "ID": "119" , "reason": ""}]]:

Это начало моего контроллера.

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

Параметр jsonstring всегда равен нулю. Кто-нибудь может понять, что не так?

UPDATE

Это мой новый контроллер на основе комментариев, чтобы использовать модель и позволяют 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

если у вас есть модель 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.

+0

Я обновил свой код выше. – forwheeler

1

изменение типа содержимого в вашем объекте ajax на строку.

Мне любопытно, почему вы хотели бы обрабатывать свой json как строку, а не как объект. Обычно я бы C# ViewModel и пусть сериализатор карты объекта JSON к этой C# вида модели в моем контроллере

+0

Я раньше не пробовал. Есть ли у вас образец? – forwheeler

+0

да может ли вы предоставить sampel codez? – nathanchere

2

Я получил эту работу, изменив 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 за вашу помощь!