Передача иерархии js-объектов в контроллер - PullRequest
1 голос
/ 26 июля 2011

У меня есть модель

  public class Foo{
     public int Id{get;set;}
     public string Name {get; set;}
     public DateTime Date {get; set;}
     public bool IsActive {get;set;}
     public List<Item> Items {get;set;}
  }

 public class Item{
    public int Id {get;set;}
    public string Name {get; set;}
    public Foo Foo {get;set;}
 }

И в моем JavaScript я делаю это:

var items = new Array();
$("#itemsSelector").each(function () {
   items.push({Id: $(this).val(), Name: $(this).text() })
}

var id = $("#id").val();
var title = $("#title").val();
var date = $("#dateTimePicker").val();
var isActive = $("#msActive").val();

$.post("SaveFoo", {Id: id, Name:title, Date:date, IsActive: isActive, Items:items })

Подпись метода действия выглядит так:

 [HttpPost]
 public JsonResult SaveFoo(Foo foo) {
      // Now. here it passes correct Id, Name, Date and bool parameter
      // And even passes the correct number of Foo.Items
      // The only thing that bothers me -
      // all the properties of every Item is either null or zero!
 }

Почемуэто происходит?Что я делаю неправильно?Как передать массив объектов в действие?Я пытался использовать jquery.serialize() и serializeArray() и даже $.toDictionary() метод, описанный здесь .

Это не помогает

1 Ответ

4 голосов
/ 26 июля 2011

Вы пробовали запрос JSON?Он намного лучше работает со сложными свойствами и коллекциями:

var items = new Array();
$('#itemsSelector').each(function () {
    items.push({ id: $(this).val(), name: $(this).text() });
}

var id = $('#id').val();
var title = $('#title').val();
var date = $('#dateTimePicker').val();
var isActive = $('#isActive').val();

$.ajax({
    url: 'SaveFoo',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify({
        id: id, 
        name: title, 
        date: date, 
        isActive: isActive, 
        items: items 
    }),
    success: function(result) {

    }
});

И если вам нужно поддерживать старые браузеры, вам может потребоваться включить скрипт json2.js , чтобы функция JSON.stringifyработы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...