7

情况是这样的:

我找不到获取viewModel传递给 POST 操作方法的方法。

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

OnException控制器的可覆盖内部:

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

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

调试代码filterContext.Controller.ViewDatanull因为在代码执行时发生异常并且没有返回视图。

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

我想在中心点将相同Viewdata/ViewModel内容返回给用户。希望你能明白我的意思。

我还有其他途径可以实现目标吗?

4

1 回答 1

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;
    }
}

并将其注册在Global.asax

ModelBinders.Binders.DefaultBinder = new MyCustomerBinder();

然后访问它:

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

    ...
}
于 2014-08-09T07:17:35.857 回答