在OnException(ExceptionContext filterContext)中恢复传递给POST动作的模型的



情况如下:

我找不到一种方法来获取传递给POST动作方法的viewModel

[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对象可用。(

我想在中心点返回与发布的data/ViewModel相同的View。希望你明白我的意思。

我是否可以遵循其他途径来实现目标?

您可以创建继承自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"];
    ...
}

相关内容

  • 没有找到相关文章