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)
归档时间: |
|
查看次数: |
1360 次 |
最近记录: |