2016-12-08 3 views
5

Я написал приложение с использованием ASP.NET MVC 5 framework. Я использую двустороннюю привязку между представлениями и ViewModels.Как я могу вручную привязать данные из ModelStateDictionary к модели представления с помощью ASP.NET MVC?

Поскольку я использую двустороннюю привязку, я получаю преимущество проверки на стороне клиента и сервера, которая является крутой. Однако, когда я отправляю на сервер запрос POST, а обработчик запроса генерирует исключение, я хочу перенаправить пользователя на метод GET.

Когда происходит перенаправление, я хочу сохранить состояние модели, чтобы страница выглядела одинаково при отображении ошибок. Я могу сохранить модель состояния и ошибки с использованием ActionFilters и TempDatavia this approach. Однако, когда запрос перенаправляется, от POST до GET состояние модели сохраняется как объект System.Web.Mvc.ModelStateDictionary, который является парой ключ/значение со всеми входами пользователя, которые поступают из запроса POST.

Чтобы предоставить страницу правильному конечному пользователю, мне нужно привязать данные в System.Web.Mvc.ModelStateDictionary к моей собственной модели презентации.

Как связать объект System.Web.Mvc.ModelStateDictionary с объектом презентации?

Вот как мой код выглядит

[ImportModelStateFromTempData] 
public ActionResult show(int id) 
{ 

    var prsenter = new UserProfileDetailsPresenter(id); 

    ModelStateDictionary tmp = TempData["Support.ModelStateTempDataTransfer"]; 

    if(tmp != null) 
    { 
     // Some how map tmp to prsenter 
    } 

    return View(prsenter); 

} 

[HttpPost] 
[ValidateAntiForgeryToken] 
[ExportModelStateToTempData] 
public ActionResult Update(int id, DetailsPresenter model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var updater = new UpdateAddressServiceProvider(CurrentUser); 

      updater.Handle(model.General); 
     } 

    } 
    catch (Exception exception) 
    { 
     ModelState.AddModelError("error", exception.Message); 
    } finally 
    { 
     return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General"); 
    } 
} 

ответ

4

Если есть ошибка, не перенаправлять, просто вернуть View.

[HttpPost] 
[ValidateAntiForgeryToken] 
[ExportModelStateToTempData] 
public ActionResult Update(int id, DetailsPresenter model) 
{ 
    try 
    { 
     if (ModelState.IsValid) 
     { 
      var updater = new UpdateAddressServiceProvider(CurrentUser); 

      updater.Handle(model.General); 
     } 

     return new RedirectResult(Url.Action("Show", new { Id = id }) + "#General"); 
    } 
    catch (Exception exception) 
    { 
     ModelState.AddModelError("error", exception.Message); 

     // Return the named view directly, and pass in the model as it stands. 
     return View("Show", model); 
    } 
} 
+0

В представлении «Показать» ожидается объект 'UserProfileDetailsPresenter', а не' DetailsPresenter'. Вместо того, чтобы создавать 'UserProfileDetailsPresenter' в каждом запросе, я скорее перенаправляюсь на действие« Индекс »и создаю ему правильный объект и просто привязываю данные. – Jaylen

+0

Лучше всего, если вы совершаете этот звонок в обоих местах (это то, что у него уже есть метод). Вы будете создавать этот 'UserProfileDetailsPresenter' каждый раз независимо. Это правильный способ сделать это в MVC. Вы не хотите помещать в свою базу данных неверные, некорректные или даже потенциально опасные данные. – krillgar

+0

Так что в этом случае нет необходимости экспортироватьModelStateToTempData, правильно? Какая польза от этого? – Jaylen