В ASP.NET MVC 5, как я могу десериализовать сложный объект из FormCollection? - PullRequest
0 голосов
/ 12 апреля 2019

Есть ли в ASP.NET MVC 5 доступные инструменты для получения параметра FormCollection из действия [HttpPost] и десериализации его в заданный тип?Например, MyModelType myModel = SOMEHOWDSERIALIZE<MyModelType>(formCollection);?

У нас есть сложный объект, с которым мы работали в ASP.NET MVC 5, используя обычные привязки EditorFor, а сообщение используется для выглядит так:

[HttpPost]
public ActionResult MyModelAction(MyModelV1 myModel)
{
    // .. process the model here
}

Теперь у нас есть новые версии модели, и мы не будем создавать новый маршрут / URL для публикацииновая модель версии полезной нагрузки.Свойства модели имеют достаточные метаданные, чтобы мы могли вывести ее десериализованный тип, поэтому мы можем использовать ее из полей формы, чтобы определить, какой тип модели десериализовать и выполнить.Итак, теперь это выглядит примерно так:

[HttpPost]
public ActionResult MyModelAction(FormCollection parameters)
{
    switch (parameters["OurVersionDisambiguator"])
    {
        case "V1":
            var myModel_V1 = SOMEHOW_DESERIALIZE<MyModel_V1>(parameters);
            return MyModelAction(myModel_V1);
        case "V2":
            var myModel_V2 = SOMEHOW_DESERIALIZE<MyModel_V2>(parameters);
            return MyModelAction(myModel_V2);
        default: throw new NotImplementedException();
    }
}

[NonAction]
public ActionResult MyModelAction(MyModelV1 myModelV1) 
{
    // process the model
}

[NonAction]
public ActionResult MyModelAction(MyModelV2 myModelV2) 
{
    // process the model
}

В приведенном выше примере я делаю вывод, что создаю что-то вроде следующего метода, и я не уверен, что с ним делать ...

T SOMEHOW_DESERIALIZE<T>(FormCollection parameters)

Я знаю, что мог бы использовать Activator и Reflection и вручную подавать десериализацию «вручную», но поскольку ASP.NET MVC обычно делает это автоматически для нас, когда мы не используем FormCollection, наверняка есть такие инструменты, которые мыможно вызвать как однострочник?

Обратите внимание, что в приведенных выше примерах обработка должна продолжать иметь доступ к контексту запроса, так как могут быть потоки выгрузки файлов, которые будут обрабатываться в одном запросе.

1 Ответ

1 голос
/ 12 апреля 2019

Так как я искал простую однострочную строку для привязки FormCollection к модели типа, известного во время выполнения, наличие привязки пользовательской модели не является большим решением.К счастью, нужная мне функция была TryUpdateModel(..).

[HttpPost]
public ActionResult MyModelAction(FormCollection parameters)
{
    switch (parameters["OurVersionDisambiguator"])
    {
        case "V1":
            var myModel_V1 = new MyModel_V1();
            var hasModelStateError /* ignoring */ =
                TryUpdateModel(myModel_V1, parameters.ToValueProvider());
            return MyModelAction(myModel_V1);
        case "V2":
            var myModel_V2 = new MyModel_V2();
            var hasModelStateError /* ignoring */ =
                TryUpdateModel(myModel_V2, parameters.ToValueProvider());
            return MyModelAction(myModel_V2);
        default: throw new NotImplementedException();
    }
}

[NonAction]
public ActionResult MyModelAction(MyModelV1 myModelV1) 
{
    // process the model
}

[NonAction]
public ActionResult MyModelAction(MyModelV2 myModelV2) 
{
    // process the model
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...