在内部OnException(ExceptionContext filterContext)中,有什么方法可以恢复传递给POST操作的模型?

Len*_*rri 6 asp.net-mvc model exception onexception action-filter

情况是这样的:

我无法找到一种方法来获取viewModel传递给POST操作方法的方法.

[HttpPost]
public ActionResult Edit(SomeCoolModel viewModel)
{
    // Some Exception happens here during the action execution...
}
Run Code Online (Sandbox Code Playgroud)

OnException控制器的overridable内:

protected override void OnException(ExceptionContext filterContext)
{
    ...

    filterContext.Result = new ViewResult
    {
        ViewName = filterContext.RouteData.Values["action"].ToString(),
        TempData = filterContext.Controller.TempData,
        ViewData = filterContext.Controller.ViewData
    };
}
Run Code Online (Sandbox Code Playgroud)

调试代码时filterContext.Controller.ViewData,null自代码执行时发生异常并且未返回任何视图.

无论如何,我看到它filterContext.Controller.ViewData.ModelState已经填满并具有我需要的所有值,但我没有完整的ViewData => viewModel对象可用.:(

我想回到同一个View与发布data/ViewModel给用户在一个中心点.希望你得到我的漂移.

为实现目标,还有其他方法可以遵循吗?

小智 8

您可以创建一个继承自DefaultModelBinder的自定义模型绑定器,并将模型分配给TempData:

public class MyCustomerBinder : DefaultModelBinder
{
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        base.OnModelUpdated(controllerContext, bindingContext);

        controllerContext.Controller.TempData["model"] = bindingContext.Model;
    }
}
Run Code Online (Sandbox Code Playgroud)

并将其注册到Global.asax:

ModelBinders.Binders.DefaultBinder = new MyCustomerBinder();
Run Code Online (Sandbox Code Playgroud)

然后访问它:

protected override void OnException(ExceptionContext filterContext)
{
    var model = filterContext.Controller.TempData["model"];

    ...
}
Run Code Online (Sandbox Code Playgroud)