Я написал приложение с использованием ASP.NET MVC 5 framework. Я использую двустороннюю привязку между представлениями и ViewModels.Как я могу вручную привязать данные из ModelStateDictionary к модели представления с помощью ASP.NET MVC?
Поскольку я использую двустороннюю привязку, я получаю преимущество проверки на стороне клиента и сервера, которая является крутой. Однако, когда я отправляю на сервер запрос POST
, а обработчик запроса генерирует исключение, я хочу перенаправить пользователя на метод GET
.
Когда происходит перенаправление, я хочу сохранить состояние модели, чтобы страница выглядела одинаково при отображении ошибок. Я могу сохранить модель состояния и ошибки с использованием ActionFilters
и TempData
via 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");
}
}
В представлении «Показать» ожидается объект 'UserProfileDetailsPresenter', а не' DetailsPresenter'. Вместо того, чтобы создавать 'UserProfileDetailsPresenter' в каждом запросе, я скорее перенаправляюсь на действие« Индекс »и создаю ему правильный объект и просто привязываю данные. – Jaylen
Лучше всего, если вы совершаете этот звонок в обоих местах (это то, что у него уже есть метод). Вы будете создавать этот 'UserProfileDetailsPresenter' каждый раз независимо. Это правильный способ сделать это в MVC. Вы не хотите помещать в свою базу данных неверные, некорректные или даже потенциально опасные данные. – krillgar
Так что в этом случае нет необходимости экспортироватьModelStateToTempData, правильно? Какая польза от этого? – Jaylen