Пользователь запрашивает страницу для Шага 1, заполняет и отправляет форму, содержащую выбранного человека, пока все хорошо. После проверки ModelState следующая модель представления строится правильно с использованием выбранного человека. Затем я пытаюсь перенаправить действие с помощью newVM, но при входе на шаг 2 обнаруживаю, что MVC стирает модель представления, которую пытались передать. Я подозреваю, что это связано с тем, как MVC пытается обновить и создать экземпляр на основе результатов строки запроса. Я поставлю точку останова и проверю это, но мне интересно, как можно изменить представление из сообщения обратно с переданной новой моделью представления?
public ActionResult Step1()
{
var vm = new VMStep1();
return View(vm);
}
[HttpPost]
public ActionResult Step1(VMStep1 vm)
{
if (ModelState.IsValid)
{
var newVM = new VMStep2(vm.SelectedPerson);
return RedirectToAction("Step2", newVM);
}
return View(vm);
}
public ActionResult Step2(VMStep2 vm)
{
return View(vm);
}
Я могу исправить это, включив VMStep2 и часть Step2 в представлении Step1, но для этого требуется логика скрытия и поиска, когда на самом деле я просто хочу, чтобы пользователь видел Step2.
newVM
сеансу (или сохранить что-то в базе данных), а затем получить его в методеStep2
(можно также использоватьTempData
, но произойдет сбой, если пользователь обновит браузер) - person   schedule 29.10.2014VMStep2
содержит только примитивные свойства, тогда ваш код будет работать нормально (RouteValueDictionary генерируется на основе свойств вашей модели). - person   schedule 04.11.2014ModelState
. И что значит, что вы не заинтересованы в использовании примитивов? Примитивные типы — этоInt32
,Boolean
,Char
и т. д., определенные в CLR, и у вас могут возникнуть проблемы с созданием модели без них. Вы приняли ответ, который работает для вас, что хорошо, но вы могли бы просто передатьvm.SelectedPerson
вStep2
, а затем инициализироватьVMStep2
в этом методе. - person   schedule 05.11.2014RedirectToAction();
, внутри создаетсяRouteValueDictionary
. Если бы эта модель содержала, скажем, толькоint ID
иstring Name
, она могла бы выглядеть какID="1", Name="ABC"
, и она была бы привязана правильно. Однако, если модель содержит свойства, которые являются сложными типами, она не будет работать, потому что значения маршрута могут содержать что-то вродеMyComplexObjectProperty="MyAssembly.MyComplexObject"
, которое не будет связываться. - person   schedule 05.11.2014