2017-01-29 2 views
3

У меня есть проект MVC 5, который работает нормально, и мне нужно перенести этот проект на MVC 6 с ядром. После того, как вы настроили все на работу, я столкнулся с проблемой: многие из моих действий принимают более одного объекта в качестве параметра. Модель связующего MVC 5 не имеет с этим никаких проблем, но MVC 6, кажется, поместил нуль во все параметры таких действий, я думаю, что это часть унификации MVC и WebAPI. Мой вопрос в том, есть ли вокруг него без добавления другой библиотеки моделей объектов-оберток запроса.

, например:
Передача нескольких объектов в качестве параметров для mvc 6 action

[HttpPost] 
    public ActionResult GetVersionData(OvlEnvironment environment, Pipeline pipeline) 
    { 
     BL.SetEnviromentVersion(pipeline, environment); 
     return PartialView("_Version", environment); 
    } 

На запросов проекта Ajax MVC 5, содержащих данные JSON в виде

{ "environment" : {*Data...*}, 
    "pipeline" : {*Data...*} 
} 

были приняты. В mvc 6 оба объекта в ответ на один и тот же запрос кажутся нулевыми.
Thanks

+0

Просьба представить конкретный пример, –

+0

хорошо, добавил пример –

+1

Попробуйте добавить [FromBody], например, GetVersionData ([FromBody] OvlEnvironment environment, [FromBody] Pipeline конвейер) –

ответ

4

Вы должны предоставить ASP.NET Core MVC Framework подсказку о том, что данные для привязки к модели можно найти в теле запроса на почту. Это делается через [FromBody] attribute.

[FromBody]: Используйте сконфигурированные форматы для привязки данных от тела запроса . Форматтера выбирается на основе типа содержимого запроса .

По дизайну невозможно связать несколько параметров с одним источником JSON, как описано here. Для того, чтобы избежать дополнительных классов модели вы можете использовать общий JObject так:

[HttpPost] 
public ActionResult GetVersionData([FromBody] JObject data) 
{ 
    var environment = data["environment"].ToObject<OvlEnvironment>(); 
    var pipline = data["pipeline"].ToObject<Pipeline>(); 

    BL.SetEnviromentVersion(pipeline, environment); 
    return PartialView("_Version", environment); 
} 
+0

«Мой вопрос в том, что вокруг все равно без добавления другой модели библиотека объектов оболочки запроса. ". Поскольку я уверен, что я не первый, кто столкнулся с этим, я подумал, что у кого-то может быть решение –

+0

Если вы добавили ссылку на проблему GitHub, где сказано, что невозможно связать тело JSON input для нескольких объектов параметров. Поэтому нужно искать какое-то другое решение. Используя JObject (JSON.net используется внутри ASP.NET Core MVC, поэтому никакая другая библиотека моделей не добавляется), вы можете избежать определения классов для переноса данных. Другим решением является объединение нескольких параметров в один объект. –

+0

Я бы подумал о настраиваемой модели binder \ formatter, чтобы справиться с проблемой, к сожалению, у меня нет времени и не хочется писать ее, к тому же ее жаль это делать, поскольку Microsoft уже делала это с более ранними версиями MVC. Моя цель - не менять много кода во время миграции. Я думаю, что создание строго типизированного объекта-обертки на самом деле является лучшим решением, чем просто принятие JObject со всеми моими действиями, как если бы я работал с свободно типизированным языком. в обоих решениях я меняю много кода. Я ищу способ, который позволил бы мне держать мой контроллер как есть. Если нет, жизнь отстой –

 Смежные вопросы

  • Нет связанных вопросов^_^