Asp.net MVC 3 JSON Модель Binder

Итак, у меня есть этот JSON

mrn:"0760433"
res:[{"registry":1,"episodeType":{"id":6,"dateAndTime":"08-06-2012 13:21"}}]

И у меня есть эти модели зрения

    public class patient
    {
        public string mrn { get; set; }

    }

    public class episodeType
    {
        public int id { get; set; }
        public string dateAndTime { get; set; }
    }

    public class registryEpisode 
    {
        public int registry { get; set; }
        public episodeType episodeType { get; set; }

       public registryEpisode()
       {
           registry = 0;
           episodeType = new episodeType();
       }
    }

И эта подпись контроллера:

public JsonResult StartSession(string mrn, List<registryEpisode> res)

Когда я публикую, res ВСЕГДА ноль. Какие-нибудь мысли? Что я делаю неправильно? Да, я пишу, да, я использую jquery:

$.post('Action', data, function () {});

Да, я получаю свой Action на моем контроллере, но res - ноль. Помогите! Заранее спасибо как всегда...!

1 ответ

Так что это было интересно решить... Я использую нокаут. В Knockout есть несколько функций, которые позволяют вам использовать viewModel в виде pojo (простой старый объект JSON) или pojso (простой старый объект javascript).

Итак, вот такой момент... механизм связывания модели asp.net ожидает преобразованную строковую строку JSON. ToJSON Knockout уже преобразует в строку viewModels, поэтому, когда у вас есть примитивный тип, такой как строка, и коллекция в качестве аргументов для вашего действия, вы должны получить значение примитивного типа, например

var m = self.model.property();

затем получить коллекцию как pojso, как

var c = ko.toJS(self.model.collection)

затем преобразовать их в одну полную модель вида

var data = JSON.stringify({prop1: m, prop2: c});,

Наконец, вы отправляете серверную часть модели с помощью вызова jquery ajax методу Action, например

public JsonResult StartSession(string prop1, IList<registryEpisode> prop2){}

Это, очевидно, делает свое дело. Для меня это похоже на взлом, но это работает. Надеюсь, это поможет кому-то еще.

Другие вопросы по тегам