现在的位置: 首页 > 移动开发 > 正文

ASP.NET MVC下基于异常处理有哪些解决方案

2020年06月02日 移动开发 ⁄ 共 2773字 ⁄ 字号 评论关闭

  EntLib的异常处理应用块(ExceptionHandlingApplicationBlock)是一个不错的异常处理框架,它使我们可以采用配置的方式来定义异常处理策略。下面学步园小编来讲解下ASP.NETMVC下基于异常处理有哪些解决方案?

  ASP.NETMVC下基于异常处理有哪些解决方案

  一、基本异常处理策略

  我们首先来讨论我们的解决方案具体采用的异常处理策略:

  对于执行Controller的某个Action方法抛出的异常,我们会按照指定配置策略进行处理。我们可以采取日志记录、异常替换和封装这些常用的异常处理方式;

  对于处理后的异常,如果异常处理策略规定需要将其抛出,则会自动重定向到与异常类型匹配的出错页面。我们会维护一个异常类型和ErrorView的匹配关系;

  对于处理后的异常,如果异常处理策略规定不需要将其抛出,则会执行与当前Action操作相匹配的错误处理Action进行处理。异常处理Action方法默认采用“On{Action}Error”这样的命名规则,而当前上下文会与异常处理操作方法的参数进行绑定。除次之外,我们会设置当前ModelState的错误信息;

  如果用户不曾定义相应的异常处理Action,依然采用“错误页面重定向”方式进行异常处理。

  ASP.NETMVC下基于异常处理有哪些解决方案

  二、通过自定义Action处理异常

  为了让读者对上面介绍的异常处理页面有一个深刻的理解,我们来进行一个实例演示。该实例用于模拟用户登录,我们定义了如下一个只包含用户名和密码两个属性的Model:LoginInfoModel。

  1:namespaceArtech.Mvc.ExceptionHandling.Models

  2:{

  3:publicclassLoginInfo

  4:{

  5:[Display(Name="UserName")]

  6:[Required(ErrorMessage="UserNameismanadatory!")]

  7:publicstringUserName{get;set;}

  8:

  9:[Display(Name="Password")]

  10:[DataType(DataType.Password)]

  11:[Required(ErrorMessage="Passwordismanadatory!")]

  12:publicstringPassword{get;set;}

  13:}

  14:}

  我们定义了如下一个AccountController,它是我们自定义的BaseController的子类。AccountController在构造的时候调用基类构造函数指定的参数代表异常处理策略的配置名称。SignIn方法代表用于进行“登录”的操作,而OnSignInError就表示该操作对应的异常处理操作。如果在SignIn操作中抛出的异常经过处理后无需再抛出,则会通过调用OnSignInError,而此时ModelState已经被设置了相应的错误消息。

  1:publicclassAccountController:BaseController

  2:{

  3:publicAccountController()

  4::base("myPolicy")

  5:{}

  6:

  7:publicActionResultSignIn()

  8:{

  9:returnView(newLoginInfo());

  10:}

  11:[HttpPost]

  12:publicActionResultSignIn(LoginInfologinInfo)

  13:{

  14:if(!ModelState.IsValid)

  15:{

  16:returnthis.View(newLoginInfo{UserName=loginInfo.UserName});

  17:}

  18:

  19:if(loginInfo.UserName!="Foo")

  20:{

  21:thrownewInvalidUserNameException();

  22:}

  23:

  24:if(loginInfo.Password!="password")

  25:{

  26:thrownewUserNamePasswordNotMatchException();

  27:}

  28:

  29:ViewBag.Message="AuthenticationSucceeds!";

  30:returnthis.View(newLoginInfo{UserName=loginInfo.UserName});

  31:}

  32:

  33:publicActionResultOnSignInError(stringuserName)

  34:{

  35:returnthis.View(newLoginInfo{UserName=userName});

  36:}

  37:}

  具体定义在SignIn操作方法中的认证逻辑是这样的:如果用户名不是“Foo”则抛出InvalidUserNameException异常;如果密码不是“password”则抛出UserNamePasswordNotMatchException异常。下面是SignIn操作对应的View的定义:

  1:@modelArtech.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:

  三、通过配置的ErrorView处理异常

  在上面的配置中,针对InvalidUserNameException和UserNamePasswordNotMatchException这两种异常类型的配置策略都将PostHandlingAction属性设置为“None”,意味着不会将原来的异常和处理后的异常进行重新抛出。现在我们将该属性设置为“ThrowNewException”,意味着我们会将处理后的异常重新抛出来。

  以上就是关于“ASP.NETMVC下基于异常处理有哪些解决方案”的内容,希望对大家有用。更多资讯请关注学步园。学步园,您学习IT技术的优质平台!

抱歉!评论已关闭.