在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());
}
}

