如何使用ASP.NET MVC将ModelStateDictionary中的数据手动绑定到表示模型?

Jay*_*len 5 c# asp.net asp.net-mvc modelstate asp.net-mvc-5

我使用ASP.NET MVC 5框架编写了一个应用程序.我在视图和ViewModel之间使用双向绑定.

由于我使用双向绑定,我得到了客户端和服务器端验证的好处,这很酷.但是,当我向POST服务器发送请求,并且请求处理程序抛出异常时,我想将用户重定向到该GET方法.

当重定向发生时,我想保存模型状态,以便在显示错误时页面看起来相同.我可以使用ActionFiltersTempData 通过这种方法保存状态模型和错误.然而,当请求被重定向,从POSTGET所述模型状态被保存为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");
    }
}
Run Code Online (Sandbox Code Playgroud)

kri*_*gar 4

如果出现错误,不重定向,只返回视图。

[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);
    }
}
Run Code Online (Sandbox Code Playgroud)