Как я могу вручную привязать данные из 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);
    }
}
Другие вопросы по тегам