您好,登錄后才能下訂單哦!
上篇對了行為過濾器的使用做了講解,如果在控制器行為的執行中遇到了異常怎么辦呢?沒關系,還好框架給我們提供了異常過濾器,在本篇中將會對異常過濾器的使用做一個大概的講解。
過濾器在系統框架中的整體對象模型
IAuthorizationFilter授權認證過濾器的執行過程
使用IAuthorizationFilter過濾器
IActionFilter行為過濾器的執行過程
自定義實現IActionFilter行為過濾器
異常過濾器的使用
在使用異常過濾器之前,我們要看一下它們的結構:
public interface IExceptionFilter { void OnException(ExceptionContext filterContext); }
IExceptionFilter接口類型是異常過濾器必須實現的接口,當然了還有FilterAttribute特性類型這是必須要實現的。在此不對FilterAttribute特性類型做什么介紹。
我們看一下IExceptionFilter接口類型中的OnException()方法中的有個ExceptionContext類型的參數,ExceptionContext類型是遺產過濾器參數上下文對象,繼承自ControllerContext類型,這種編程模式在MVC框架中隨處可見了不做多的解釋了。
在MVC框架中給我們默認的提供了一個異常過濾器類型:
代碼1-1
public class HandleErrorAttribute : FilterAttribute, IExceptionFilter { // 摘要: // 初始化 System.Web.Mvc.HandleErrorAttribute 類的新實例。 public HandleErrorAttribute(); public Type ExceptionType { get; set; } public string Master { get; set; } public string View { get; set; } public virtual void OnException(ExceptionContext filterContext); }
ExceptionType屬性對應要處理的異常類型,如果設置某種異常類型值那么異常過濾器只會針對這個類型的異常來進行做處理,默認值是處理所有異常類型。
Master屬性則是設置在處理異常之后所要顯示視圖所用的布局。
View屬性是設置在處理異常之后所要顯示的視圖名稱。
來看示例:
示例還是接著上個篇幅的示例,沒看過前篇的朋友也沒什么影響很簡單的示例。
代碼1-2
public ActionResult Index() { int i = 0; int j = 3 / i; return View(_DataStandard.GetProducts()); }
首先我們在控制器的Index()方法中定義個錯誤處理,0是不能作為除數的處理到這必須報異常的。運行的結果如圖1所示。
圖1
很明確的報出了異常的所在,這是我們不希望的看見的,接下來我們把異常過濾器給使用上:
代碼1-3
[HandleError] public ActionResult Index() { int i = 0; int j = 3 / i; return View(_DataStandard.GetProducts()); }
這時你會發現運行的結果和圖1中所示的一樣,這是坑爹呢??!!!!當然不是我們需要在Web.config文件的中的<system.web>節點下做相對應的配置才可以,
代碼1-4
<customErrors mode="On"" />
需要添加代碼1-4中的內容到system.web節點下,這是我們再來看一下運行的結果圖。
圖2
為什么會顯示這個頁面,這跟HandleErrorAttribute類型中的OnException(ExceptionContext filterContext)方法默認實現有關系,它默認設置就是服務器錯誤信息,那我們怎么自定義的指定我們想顯示的頁面,或者是看到我們想詳細看到的錯誤信息呢?我們再來重寫一下OnException()方法吧。
代碼1-5
public class MyCustomHandleErrorAttribute : HandleErrorAttribute { public override void OnException(ExceptionContext filterContext) { if (filterContext == null) { throw new ArgumentNullException("filterContext"); } if (filterContext.Exception!=null) { Exception innerException = filterContext.Exception; if (!filterContext.ExceptionHandled) { string controllerName = (string)filterContext.RouteData.Values["controller"]; string actionName = (string)filterContext.RouteData.Values["action"]; HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName); ViewResult result = new ViewResult { ViewName = "Error", MasterName = this.Master, ViewData = new ViewDataDictionary<HandleErrorInfo>(model), TempData = filterContext.Controller.TempData }; filterContext.Result = result; filterContext.ExceptionHandled = true; } } } }
在上面的MyCustomHandleErrorAttribute類型實現中,我們只需要關注ExceptionContext filterContext參數中的Result的設置,在代碼1-5中我們指定了Error這個視圖,并且還實例化了HandleErrorInfo類型作為視圖模型傳遞到視圖中,我們現在要新建一個視圖,在當前控制器的文件夾下View/[controllername]/Error.cshtml新建這個視圖文件,并且選擇為強類型視圖,類型則為HandleErrorInfo類型,我們看一下視圖的定義。
代碼1-6:
@model HandleErrorInfo @{ ViewBag.Title = "Error"; } <h3> Error</h3> <p> 異常類型:<b>@Model.Exception.GetType().Name</b> 異常所在控制器:<b>@Model.ControllerName</b> 異常所在控制器行為:<b>@Model.ActionName</b> </p> <p> 詳細信息:<b>@Model.Exception.Message</b> </p>
現在我們修改一下代碼1-3中的所使用的過濾器,修改為我們代碼1-5中定義的自定義類型,再看一下運行結果:
到這里異常過濾器的基礎使用也就講解完畢了。還有一種結果過濾器就不做講解了,基礎結構和行為過濾器近乎相同使用方式也是,使用一下便知其用法。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。