ASP.NET MVC: отправка JSON к контроллеру

Я хочу быть в состоянии отправить 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 не делает и весь пример Образцовых Редакторов связей не будет работать также. Мое лучшее решение до сих пор состоит в том, чтобы преобразовать объект в словарь и цикл, хотя каждый параметрический усилитель и подходит его. Не кажется идеальным.

9
задан Damien 26 January 2010 в 10:11
поделиться

1 ответ

Я использую пользовательскую модель 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. Вы испытываете другой результат?

8
ответ дан 3 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: