Как я могу вручную привязать данные из ModelStateDictionary к модели представления с ASP.NET MVC?
Я написал приложение, используя ASP.NET MVC 5 Framework. Я использую двустороннюю привязку между представлениями и моделями представления.
Поскольку я использую двухстороннее связывание, я получаю выгоду от проверки на стороне клиента и сервера, что здорово. Тем не менее, когда я отправляю POST
запрос к серверу, а обработчик запроса выдает исключение, я хочу перенаправить пользователя на GET
метод.
Когда происходит перенаправление, я хочу сохранить состояние модели, чтобы страница выглядела одинаково при отображении ошибок. Я могу сохранить модель состояния и ошибки, используя ActionFilters
а также TempData
с помощью этого подхода. Однако, когда запрос перенаправлен из 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");
}
}
1 ответ
Если есть ошибка, не перенаправляйте, просто верните 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);
}
}