小编给大家分享一下ASP。净MVC对异常进行处理的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
ASP。净MVC是一个极具可扩展开发框架,在这篇文章中我将通过它的扩展实现与EntLib的集成,并提供一个完整的解决异常处理解决方案。
EntLib的异常处理应用块(异常处理程序块)是一个不错的异常处理框架,它使我们可以采用配置的方式来定义异常处理策略,而ASP。净MVC是一个极具可扩展开发框架,在这篇文章中我将通过它的扩展实现与EntLib的集成,并提供一个完整的解决异常处理解决方案。
我们首先来讨论我们的解决方案具体采用的异常处理策略:
对于执行控制器的某个行动方法抛出的异常,我们会按照指定配置策略进行处理。我们可以采取日志记录,异常替换和封装这些常用的异常处理方式;
对于处理后的异常,如果异常处理策略规定需要将其抛出,则会自动重定向到与异常类型匹配的出错页面。我们会维护一个异常类型和错误观点的匹配关系;
对于处理后的异常,如果异常处理策略规定不需要将其抛出,则会执行与当前行动操作相匹配的错误处理行动进行处理。异常处理行动方法默认采用“{行动}错误”这样的命名规则,而当前上下文会与异常处理操作方法的参数进行绑定。除次之外,我们会设置当前状态的错误信息;
如果用户不曾定义相应的异常处理,依然采用“错误页面重定向“方式进行异常处理。
为了让读者对上面介绍的异常处理页面有一个深刻的理解,我们来进行一个实例演示。该实例用于模拟用户登录,我们定义了如下一个只包含用户名和密码两个属性的模型:LoginInfoModel。
名称空间Artech.Mvc.ExceptionHandling.Models { 公开课LoginInfo { (显示(Name=坝没ame")] (要求(ErrorMessage=坝没莔anadatory !“)) 公共字符串的用户名{;设置;} (显示(Name=癙assword")] (数据类型(DataType.Password)) (要求(ErrorMessage=懊苈雖anadatory !“)) 公共字符串密码{得到;设置;} } }
我们定义了如下一个AccountController,它是我们自定义的BaseController的子类.AccountController在构造的时候调用基类构造函数指定的参数代表异常处理策略的配置名称.SignIn方法代表用于进行“登录”的操作,而OnSignInError就表示该操作对应的异常处理操作。如果在SignIn操作中抛出的异常经过处理后无需再抛出,则会通过调用OnSignInError,而此时状态已经被设置了相应的错误消息。
公共类AccountController BaseController { 公共AccountController () 基地(“myPolicy") {} 公共ActionResult SignIn () { 返回视图(新LoginInfo ()); } (HttpPost) 公共ActionResult SignIn (LoginInfo LoginInfo) { 如果(! ModelState.IsValid) { 返回。视图(新LoginInfo {UserName=LoginInfo。用户名}); } 如果(loginInfo。用户名!=癋oo") { 把新InvalidUserNameException (); } 如果(loginInfo。密码!=皃assword") { 把新UserNamePasswordNotMatchException (); } ViewBag。消息=吧矸菅橹こ晒?“; 返回。视图(新LoginInfo {UserName=LoginInfo。用户名}); } 公共ActionResult> @ model Artech.Mvc.ExceptionHandling.Models.LoginInfo @ { ViewBag。Title=癝ignIn"; } @Html.ValidationSummary () @ if (ViewBag。消息!=null) { @ViewBag.Messages } @using (Html.BeginForm ()) { @Html.EditorForModel () & lt;输入类型=皊ubmit"值=https://www.yisu.com/zixun/" SignIn "/> }
在AccountController初始化时指定的异常处理策略“myPolicy”定义在如下的配置中。我们专门针对SignIn操作方法抛出的InvalidUserNameException和UserNamePasswordNotMatchException进行了处理,而ErrorMessageSettingHandler是我们自定义的异常处理器,它仅仅用于设置错误消息。如下面的代码片断所示,如果上述的这两种类型的异常被抛出,最终的错误消息会被指定为“用户名不存在!”和“用户名密码不匹配!”。
& lt; exceptionHandling> & lt; exceptionPolicies> & lt;添加名称=癿yPolicy"祝辞 & lt; exceptionTypes> & lt;添加名称=癐nvalidUserNameException" 类型=癆rtech.Mvc.ExceptionHandling.Models。InvalidUserNameException Artech.Mvc.ExceptionHandling" postHandlingAction=癗one"比; & lt; exceptionHandlers> & lt;添加名称=癊rrorMessageSettingHandler" 类型=癆rtech.Mvc.ExceptionHandling。ErrorMessageSettingHandler Artech.Mvc.ExceptionHandling" errorMessage=坝没淮嬖?“/比; & lt;/exceptionHandlers> & lt;/add> & lt;添加名称=癠serNamePasswordNotMatchException" 类型=癆rtech.Mvc.ExceptionHandling.Models。UserNamePasswordNotMatchException Artech.Mvc.ExceptionHandling" postHandlingAction=癗one"比; & lt; exceptionHandlers> & lt;添加名称=癊rrorMessageSettingHandler" 类型=癆rtech.Mvc.ExceptionHandling。ErrorMessageSettingHandler Artech.Mvc.ExceptionHandling" errorMessage=坝没苈氩黄ヅ?“/比; & lt;/exceptionHandlers> & lt;/add> & lt;/exceptionTypes> & lt;/add> & lt;/exceptionPolicies> & lt;/exceptionHandling>ASP。NET MVC对异常进行处理的