16、ASP.NET MVC入门到精通——MVC过滤器
本系列目錄:ASP.NET MVC4入門到精通系列目錄匯總
在ASP.NET MVC中有四種過濾器類型
?Action
1、在ASP.NET MVC項目中,新建文件夾Filter,然后新建類MyCustormFilter,繼承自ActionFilterAttribute類,我們來看下ActionFilterAttribute類有如下四個方法,從命名我應該就可以看出他們的執行時機。
public class MyCustormFilter:ActionFilterAttribute{public override void OnActionExecuting(ActionExecutingContext filterContext){filterContext.HttpContext.Response.Write("Action執行前");base.OnActionExecuting(filterContext);}public override void OnActionExecuted(ActionExecutedContext filterContext){filterContext.HttpContext.Response.Write("Action執行后");base.OnActionExecuted(filterContext);}}2、對于過濾器,我們可以把它們加在三個地方,一個是控制器上面(控制器下面的所有Action),一個是Action上面(指定標識的Action),另一個就是全局位置(所有控制器中的Action)。這里我只演示在Action上面加
?????? [MyCustormFilter]??????? public ActionResult Index()
??????? {
??????????? return View();
??????? }
?????? public ActionResult Index1()
?????? {
?????????? return View();
}???
3、build然后運行
Result
?1、新建類TestResultFilter,繼承ActionFilterAttribute
public class TestResultFilter:ActionFilterAttribute{/// <summary>/// 加載 "視圖" 前執行/// </summary>/// <param name="filterContext"></param>public override void OnResultExecuting(System.Web.Mvc.ResultExecutingContext filterContext){filterContext.HttpContext.Response.Write("加載視圖前執行 OnResultExecuting <br/>");base.OnResultExecuting(filterContext);}/// <summary>/// 加載"視圖" 后執行/// </summary>/// <param name="filterContext"></param>public override void OnResultExecuted(System.Web.Mvc.ResultExecutedContext filterContext){filterContext.HttpContext.Response.Write("加載視圖后執行 OnResultExecuted <br/>");base.OnResultExecuted(filterContext);}}2、這里我把TestResultFilter過濾器加在控制器上面
[TestResultFilter]public class FilterTestController : Controller{[MyCustormFilter]public ActionResult Index(){return View();}public ActionResult Index1(){return View();}}3、運行看下結果
注意:Result過濾器,無論Action的返回類型為什么(甚至void)都將執行。
RouteData中保存了當前請求匹配的路由信息和路由對象
修改MyCustormFilter.cs
public override void OnActionExecuting(ActionExecutingContext filterContext){//1.獲取獲取請求的類名和方法名string strController = filterContext.RouteData.Values["controller"].ToString();string strAction = filterContext.RouteData.Values["action"].ToString();//2.另一種方式 獲取請求的類名和方法名string strAction2 = filterContext.ActionDescriptor.ActionName;string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;filterContext.HttpContext.Response.Write("Action執行前</br>");filterContext.HttpContext.Response.Write("控制器:" + strController + "</br>");filterContext.HttpContext.Response.Write("控制器:" + strController2+"</br>");filterContext.HttpContext.Response.Write("Action:" + strAction + "</br>");filterContext.HttpContext.Response.Write("Action:" + strAction2 + "</br>");base.OnActionExecuting(filterContext);}?
AuthorizeAttribute
1、? 新建TestAuthorizeAttribute
/// <summary>/// 授權過濾器 --在Action過濾器前執行/// </summary>public class TestAuthorizeAttribute:AuthorizeAttribute{public override void OnAuthorization(AuthorizationContext filterContext){filterContext.HttpContext.Response.Write("<br/>OnAuthorization<br/>");//注釋掉父類方法,因為父類里的 OnAuthorization 方法會調用asp.net的授權驗證機制!//base.OnAuthorization(filterContext);} }2、在控制器FilterTest中的Index上添加TestAuthorize標記
[MyCustormFilter][TestAuthorize]public ActionResult Index(){return View();}運行看下結果:
Exception
1、新建TestHandleError.cs
/// <summary>/// 異常處理 過濾器/// </summary>public class TestHandleError : HandleErrorAttribute{public override void OnException(ExceptionContext filterContext){//1.獲取異常對象Exception ex = filterContext.Exception;//2.記錄異常日志//3.重定向友好頁面filterContext.Result = new RedirectResult("~/error.html");//4.標記異常已經處理完畢filterContext.ExceptionHandled = true;base.OnException(filterContext);}}2、在Action上面加TestHandleError
[TestHandleError]public ActionResult GetErr(){int a = 0;int b = 1 / a;return View();}注意:通常這樣的異常處理我們是放在全局過濾器上面的。
public class FilterConfig{public static void RegisterGlobalFilters(GlobalFilterCollection filters){//filters.Add(new HandleErrorAttribute());//添加全局過濾器filters.Add(new TestHandleError());}}?
總結
以上是生活随笔為你收集整理的16、ASP.NET MVC入门到精通——MVC过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 快速安装及部署DRBD
- 下一篇: error LNK2019: 无法解析的