2012-06-13 2 views
1

Сейчас я просто изучаю MVC3, и это меня действительно сбивает с толку.Почему создание новой модели ViewModel возвращает те же данные, что и старый ViewModel?

У меня есть ViewModel, который содержит некоторые дочерние ViewModels. Каждый из ChildViewModels получает визуализацию с другим частичным представлением и при подаче выполняет другое действие на контроллере. Все ChildViewModels должны выполнить некоторую выборочную проверку своих данных, и в случае успеха она должна перейти к следующей странице. Если проверка не удалась, она должна просто вернуться к ParentView и отобразить ошибки.

[HandleError] 
public class MyController: Controller 
{ 
    public ActionResult Index() 
    { 
     var viewModel = new ParentViewModel(); 
     return View("ParentView", viewModel); 
    } 

    [HttpPost] 
    public ActionResult ChildViewModelB_Action(ChildViewModelB viewModel) 
    { 
     if (ModelState.IsValid) 
     { 
      return View("ChildViewModelB_Page2", viewModel); 
     } 
     else 
     { 

      // I'm having trouble returning to the ParentView and 
      // simply displaying the ChildViewModel's errors, however 
      // discovered that creating a new copy of the VM and displaying 
      // the ParentView again shows the existing data and any errors 
      // But why?? 
      var vm = new ParentViewModel(); 
      return View("ParentView", vm); 
     } 
    } 
} 

Например,

  • Нагрузки страницы с 3-мя вариантами.
  • Пользователь выбирает вариант B и заполняет форму.
  • После отправки дочерний элемент ViewModel B получает подтверждение и завершается сбой.
  • Страница возвращается в ParentView с заполнением ChildB, однако теперь также отображаются ошибки ChildB.

Почему создает новую копию ParentViewModel дисплея ParentView с теми же данными, что и оригинальным ParentViewModel?

И можно ли по-другому вернуться к ParentView после проверки на стороне сервера?

+0

Почему вы не хотите, чтобы показать ошибки в если проверка завершена? – VJAI

+0

@Mark Я действительно хочу ... Я просто не знаю, как. Единственный способ, которым я обнаружил ошибки в ParentView, - создать новый ParentViewModel и вернуть представление, но мне не имеет никакого смысла, почему это работает – Rachel

+0

Думаю, я сейчас понимаю проблему. будет обновлять ответ. – VJAI

ответ

2

Вы должны очистить ModelState, если вы собираетесь изменять значения в своем действии POST

else 
{ 
    ModelState.Clear(); 
    var vm = new ParentViewModel(); 
    return View("ParentView", vm); 
} 

Причина этого в том, что Html помощник, такие как TextBoxFor сначала ищет в ModelState при связывании их значения и после что в модели. А поскольку модельное состояние уже содержит значения POSTED, это то, что используется => модель игнорируется. Это по дизайну.

Это существо говорит правильно, что нужно сделать в вашем случае просто перенаправить к действию GET, который уже гасит модель и уважать Redirect-After-Post pattern:

else 
{ 
    return RedirectToAction("Index"); 
} 
+0

Спасибо, теперь все имеет смысл! :) – Rachel

+0

@Rachel вы сказали, что хотите отображать ошибки в ParentView .. но я не думаю, что это покажет ошибки – VJAI

+0

@Mark Возможно, я неправильно понял ваш вопрос. Ошибки в PartialView, который является частью ParentView. – Rachel

0

Почему создает новый экземпляр ParentViewModel отображения ParentView с теми же данными, что и оригинальный ParentViewModel?

Поскольку значения полей извлекаются из формы POSTED, а не из модели. Это имеет смысл? Мы не хотим, чтобы пользователь показывал форму, заполненную разными значениями, из представленных.