Alan Cai's Blogs
只埋头苦干是不行的,有时候还得抬头看看外面的世界。

在日常开发中,经常会使用自定义异常传递业务逻辑验证消息,在ASP.NET MVC可采用重载 Controller 的 OnException 方法进行自定义异常的捕捉。

自定义异常类,用于承载业务逻辑验证信息,如下列代码所示:

1 using System;
2 
3 namespace Web
4 {
5     public class CustomException : ApplicationException
6     {
7         public CustomException(string message) : base(message) { }
8     }
9 }

自定义 ASP.NET MVC 控制器,重载 OnException 方法,核心部分在于获取自定义异常,将异常消息附加到 ModelState,并将 filterContext.ExceptionHandled 设置为 true,获取发送页面请求的 ActionName,并重新执行该 Action。最终验证信息可通过 Html.ValidationSummary() 显示出来。如下列代码所示:

 1 using System.Web.Mvc;
 2 using NLog;
 3 
 4 namespace Web
 5 {
 6     public class BaseController : Controller
 7     {
 8         private readonly Logger _logger = LogManager.GetCurrentClassLogger();
 9 
10         protected override void OnException(ExceptionContext filterContext)
11         {
12             var exception = filterContext.Exception;
13 
14             if (exception is CustomException)
15             {
16                 ModelState.AddModelError("", exception.Message);
17                 filterContext.ExceptionHandled = true;
18                 var actionName = RouteData.GetRequiredString("action");
19                 ActionInvoker.InvokeAction(filterContext.Controller.ControllerContext, actionName);
20             }
21             else
22             {
23                 _logger.ErrorException(exception.Message, exception);
24             }
25         }
26     }
27 }

演示代码如下列所示。

 1 using System.Web.Mvc;
 2 using Web.Models;
 3 
 4 namespace Web.Controllers
 5 {
 6     public class HomeController : BaseController
 7     {
 8         public ActionResult Index()
 9         {
10             return View(new Model());
11         }
12 
13         [HttpPost]
14         public ActionResult Index(Model model)
15         {
16             if (ModelState.IsValid)
17             {
18                 throw new CustomException("自定义异常消息。");
19             }
20 
21             return View(model);
22         }
23     }
24 }

详细代码可见点击下载附件

posted on 2013-06-05 18:20  Alan Cai  阅读(2577)  评论(0编辑  收藏  举报