asp.net-mvc – 我可以从动作过滤器返回动作结果吗?
发布时间:2020-05-24 19:25:30 所属栏目:asp.Net 来源:互联网
导读:通常我在将数据提交到数据库之前在action方法中验证我的模型. [HttpPost]public ActionResult MyActionMethod(MyModelType model){if (ModelState.IsValid){ //commit changes to database... return View(SuccessView,model);}re
|
通常我在将数据提交到数据库之前在action方法中验证我的模型. [HttpPost]
public ActionResult MyActionMethod(MyModelType model){
if (ModelState.IsValid){
//commit changes to database...
return View("SuccessView",model);
}
return View(model);
}
但在一些非常罕见的情况下,我需要在提交模型时在业务层中执行一些额外的验证.如果发生验证错误,我想在业务层中引发异常并使用该异常返回带有验证错误的视图. 我正在寻找一种方法来实现它,而无需改变我的控制器中的任何代码.所以我正在寻找避免这种情况的方法: [HttpPost]
public ActionResult MyActionMethod(MyModelType model){
if (ModelState.IsValid){
try {
//commit changes to database...
} catch (ValidationException e){
ModelState.AddModelError(...);
return View(model);
}
return View("SuccessView",model);
}
return View(model);
}
有没有办法做到这一点? 我正在考虑一个捕获ValidationExceptions的动作过滤器,并在常规[HandleError]过滤器启动之前返回带有验证错误的合适视图.这样的事情可能吗? 编辑:我刚刚找到解决方案(见下文),但直到48小时后我才能将此标记为正确答案… 解决方法我在ASP.NET MVC源代码中搜索了一下后才找到解决方案:它不能用动作过滤器完成,因为在调用动作方法之前和之后调用它,但它实际上并不包含动作方法调用. 但是,它可以使用自定义ActionMethodInvoker完成: public class CustomActionInvoker : ControllerActionInvoker
{
protected override ActionResult InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,System.Collections.Generic.IDictionary<string,object> parameters)
{
try
{
//invoke the action method as usual
return base.InvokeActionMethod(controllerContext,actionDescriptor,parameters);
}
catch(ValidationException e)
{
//if some validation exception occurred (in my case in the business layer)
//mark the modelstate as not valid and run the same action method again
//so that it can return the proper view with validation errors.
controllerContext.Controller.ViewData.ModelState.AddModelError("",e.Message);
return base.InvokeActionMethod(controllerContext,parameters);
}
}
}
然后,在控制器上: protected override IActionInvoker CreateActionInvoker()
{
return new CustomActionInvoker();
} (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-mvc – 自定义DateTime模型绑定在Asp.net MVC
- entity-framework – 从Entity Framework 6升级到EF Core
- asp.net-mvc-3 – Ajax.BeginForm返回整页
- 为什么我的客户端去服务器来检查在使用ASP.NET MVC包时是否
- 在ASP.NET 5中获取AuthenticationProperties
- asp.net-mvc – 将默认日期格式应用于ASP.NET MVC 3应用程序
- asp.net-mvc – 如何创建文件并通过ASP.NET MVC中的FileRes
- 如何利用ASP.net IIS 7.5中的浏览器缓存
- asp.net – 如何在Web / Windows窗体中将IronRuby或IronPyt
- asp.net – 如何从内容页面访问母版页控件
推荐文章
站长推荐
- asp.net – 当DataList为空时需要显示消息
- 具有多个ASP.NET Web应用程序的Visual Studio解决
- 如何在ASP.Net MVC标记中克服我对%%的恐惧?
- asp.net-mvc-3 – 如何在剃须刀视图中设置复选框
- asp.net – 有一个可靠的方法来防止在匿名用户可
- asp.net-mvc – Kendo ASP.NET MVC – 索引超出范
- asp.net – 无法自动进入服务器.无法确定停止位置
- asp.net-mvc-4 – ASP.NET Web API架构建议/反馈
- asp.net-mvc – 如何继承ASP.NET MVC控制器并仅更
- asp.net – 401向web api发送ajax请求时未经授权
热点阅读
