ASP.NET MVC下基于异常处理的完整解决方案

EntLib的异常处理应用块(Exception Handling Application Block)是一个不错的异常处理框架,它使我们可以采用配置的方式来定义异常处理策略。而ASP.NET MVC是一个极具可扩展开发框架,在这篇文章中我将通过它的扩展实现与EntLib的集成,并提供一个完整的解决异常处理解决方案。[源代码从这里下载]
一、基本异常处理策略
我们首先来讨论我们的解决方案具体采用的异常处理策略:
   对于执行Controller的某个Action方法抛出的异常,我们会按照指定配置策略进行处理。我们可以采取日志记录、异常替换和封装这些常用的异常处理方式;
   对于处理后的异常,如果异常处理策略规定需要将其抛出,则会自动重定向到与异常类型匹配的出错页面。我们会维护一个异常类型和Error View的匹配关系;
   对于处理后的异常,如果异常处理策略规定不需要将其抛出,则会执行与当前Action操作相匹配的错误处理Action进行处理。异常处理Action 方法默认采用“On{Action}Error”这样的命名规则,而当前上下文会与异常处理操作方法的参数进行绑定。除次之外,我们会设置当前 ModelState的错误信息;
   如果用户不曾定义相应的异常处理Action,依然采用“错误页面重定向”方式进行异常处理。
二、通过自定义Action处理异常
为了让读者对上面介绍的异常处理页面有一个深刻的理解,我们来进行一个实例演示。该实例用于模拟用户登录,我们定义了如下一个只包含用户名和密码两个属性的Model:LoginInfoModel。
  1: namespace Artech.Mvc.ExceptionHandling.Models
  2: {
  3:     public class LoginInfo
  4:     {
  5:         [Display(Name ="User Name")]
  6:         [Required(ErrorMessage = "User Name is manadatory!")]
  7:         public string UserName { get; set; }
  8:  
  9:         [Display(Name = "Password")]
 10:         [DataType(DataType.Password)]
 11:         [Required(ErrorMessage = "Password is manadatory!")]
 12:         public string Password { get; set; }
 13:     }
 14: }
我 们定义了如下一个AccountController,它是我们自定义的BaseController的子类。AccountController在构造 的时候调用基类构造函数指定的参数代表异常处理策略的配置名称。SignIn方法代表用于进行“登录”的操作,而OnSignInError就表示该操作 对应的异常处理操作。如果在SignIn操作中抛出的异常经过处理后无需再抛出,则会通过调用OnSignInError,而此时ModelState已 经被设置了相应的错误消息。
  1: public class AccountController : BaseController
  2: {
  3:     public AccountController()
  4:         : base("myPolicy")
  5:     { }
  6:  
  7:     public ActionResult SignIn()
  8:     {
  9:         return View(new LoginInfo());
 10:     }
 11:     [HttpPost]
 12:     public ActionResult SignIn(LoginInfo loginInfo)
 13:     {
 14:         if (!ModelState.IsValid)
 15:         {
 16:             return this.View(new LoginInfo { UserName = loginInfo.UserName });
 17:         }
 18:  
 19:         if (loginInfo.UserName != "Foo")
 20:         {
 21:             throw new InvalidUserNameException();
 22:         }
 23:  
 24:         if (loginInfo.Password != "password")
 25:         {
 26:             throw new UserNamePasswordNotMatchException();
 27:         }
 28:  
 29:         ViewBag.Message = "Authentication Succeeds!";
 30:         return this.View(new LoginInfo { UserName = loginInfo.UserName });
 31:     }
 32:  
 33:     public ActionResult OnSignInError(string userName)
 34:     {
 35:         return this.View(new LoginInfo { UserName = userName });
 36:     }
 37: }
具 体定义在SignIn操作方法中的认证逻辑是这样的:如果用户名不是“Foo”则抛出InvalidUserNameException异常;如果密码不 是“password”则抛出UserNamePasswordNotMatchException异常。下面是SignIn操作对应的View的定义:
  1: @model Artech.Mvc.ExceptionHandling.Models.LoginInfo
  2: @{
  3:     ViewBag.Title = "SignIn";
  4: }
  5: @Html.ValidationSummary()
  6: @if (ViewBag.Messages != null)
  7: {
  8:     @ViewBag.Messages
  9: }
 10: @using (Html.BeginForm())
 11: {
 12:     @Html.EditorForModel()
 13:     <input type="submit" value="SignIn" />
 14: }

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Grow your business fast with

Suku