情况如下:
我找不到一种方法来获取传递给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.ViewData
是null
,因为在代码执行时发生了异常,没有返回视图。
无论如何,我看到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"];
...
}