Я хочу быть в состоянии отправить JSON в противоположность стандартному QueryStrings при создании сообщения к моим контроллерам в ASP.NET MVC. У меня есть хорошо работающий материал Фронтенда (здание и затем представление моих объектов JSON).
Проблема находится на стороне контроллера, где ModelBinders по умолчанию, которые поставлются с платформой MVC, не поддерживают это.
Я видел комбинацию путей вокруг этого, один из них должен применить фильтр, который берет объект в качестве параметра, пользуется библиотекой JSON для десериализовывания его и добавляет это к параметрам действия. Это не идеально.
Другой, лучше, путь состоит в том, чтобы использовать пользовательский Образцовый Редактор связей. Все у тех, которых я видел, хотя предполагают Вас, будет только одна модель и это будет классом, а не переменной. Если у Вас есть несколько, это ломается.
Кто-либо еще встретился с этим? Одна идея, которую я имел, состояла в том, если я мог бы просто переопределить, как соглашения о MVC с FormCollection и прерывают там, добавляя значения к набору сам и надеясь, что MVC может выполнить в остальных, это - нормальный вид. Кто-либо знает, возможно ли это?
Ключевой вопрос, я думаю, то, что моя проблема не с привязкой, потому что мои модели представления не отличаются от как они где прежде. Проблема получает значения из Сообщения JSON.
Если я - корректный get's MVC значения от QueryString и помещаю его в набор формы, который тогда используется для ModelBinding. Таким образом, разве корректный метод не должен быть должен изменить способ, которым присваивают FormCollection?
Пример действия:
public ActionResult MyFirstAction(Int32 ID, PersonObject Person, ClassObject ClassDetails)
{
//etc
}
Нормальные обязательные работы, JSON не делает и весь пример Образцовых Редакторов связей не будет работать также. Мое лучшее решение до сих пор состоит в том, чтобы преобразовать объект в словарь и цикл, хотя каждый параметрический усилитель и подходит его. Не кажется идеальным.
Я использую пользовательскую модель Binder для JSON, как это:
public class JsonModelBinder<T> : IModelBinder {
private string key;
public JsonModelBinder(string requestKey) {
this.key = requestKey;
}
public object BindModel(ControllerContext controllerContext, ...) {
var json = controllerContext.HttpContext.Request[key];
return new JsonSerializer().Deserialize<T>(json);
}
}
, а затем проводит его в Global.Asax.cs, как это:
ModelBinders.Binders.Add(
typeof(Product),
new JsonModelBinder<Product>("ProductJson"));
Вы можете узнать больше об этом здесь: Наследование - это зло: эпический ДатананотацииModelBinder
Редактировать
JSONMODELBINDER следует использовать на параметре действий контроллера, набранного только в качестве продукта. INT32 и ClassObject должны вернуться к по умолчанию ModelBinder. Вы испытываете другой результат?