在日常开发中,经常会使用自定义异常传递业务逻辑验证消息,在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 }
详细代码可见点击下载附件。