在ASP.NET MVC中有四種過濾器類型 Action 1、在ASP.NET MVC項目中,新建文件夾Filter,然後新建類MyCustormFilter,繼承自ActionFilterAttribute類,我們來看下ActionFilterAttribute類有如下四個方法,從命名我應該就可以 ...
在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()); } }