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){}
Это, очевидно, делает свое дело. Для меня это похоже на взлом, но это работает. Надеюсь, это поможет кому-то еще.