MVC過濾器一共分爲四個:ActionFilter(方法過濾器),ResultFilter(結果過濾器,感覺不是很好聽,就這樣叫吧),AuthorizationFilter(授權過濾器),ExceptionFilter(異常處理過濾器)
過濾器類型 | 接口 | 默認實現 | 描述 |
Action | IActionFilter | ActionFilterAttribute | 在動作方法之前及之後運行 |
Result | IResultFilter | ActionFilterAttribute | 在動作結果被執行之前和之後運行 |
AuthorizationFilter | IAuthorizationFilter | AuthorizeAttribute | 首先運行,在任何其它過濾器動作方法之前運行 |
Exception | IExceptionFilter | HandleErrorAttribute | 只在另外一個過濾器,動作方法,動作結果彈出異常時運行 |
示例:Action方法過濾器
/// <summary>
/// Action方法 過濾器 類
/// </summary>
public class MyActionFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// 在 Action方法之前 調用
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
//1. RouteData 中 保存了 當前請求 匹配的 路由信息和路由對象
// 如果本次請求 是請求了某個 區域 裏的 控制器方法,還可以通過filterContext.RouteData.DataTokens["area"]獲取區域名
//string strArea = filterContext.RouteData.DataTokens["area"].ToString();
string strController = filterContext.RouteData.Values["controller"].ToString();
string strAction = filterContext.RouteData.Values["action"].ToString();
//filterContext.RouteData.GetRequiredString
//2.另一種方式 獲取 請求的 類名和方法名
string strAction2 = filterContext.ActionDescriptor.ActionName;
string strController2 = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName;
//2.1檢查 被請求方法 是否 加了 MoneyAttribute 特性
if (filterContext.ActionDescriptor.IsDefined(typeof(Filters.MoneyAttribute), false))
{
//直接爲 請求 設置 返回結果,而不執行 對應的 Action 方法,也不執行 OnActionExcuted,但是,會執行 Result過濾器和 生成視圖
filterContext.Result = new ContentResult() { Content = "<br/>哈哈哈,直接被跳過了吧~~~!<br/>" };
}
filterContext.HttpContext.Response.Write("哇哈哈哈~!OnActionExecuting<br/>");
base.OnActionExecuting(filterContext);
}
/// <summary>
/// 在 Action方法之後 調用
/// </summary>
/// <param name="filterContext"></param>
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Response.Write("哇哈哈哈~!OnActionExecuted<br/>");
base.OnActionExecuted(filterContext);
}
使用方法1:將過濾器加到方法上
[Filters.MyActionFilter]//1.將 過濾器 加到方法上
[Filters.Money]
[Filters.MyResultFilter]
[Filters.MyAuthorize]
public ActionResult Index()
{
Response.Write("Index 方法<br/>");
ViewBag.name = "時間:" + DateTime.Now;
return View();
}
使用方法2:將過濾器加到方類上
[Filters.MyActionFilter]
public class HomeController : Controller
{
}
使用方法3:添加全局過濾器,即添加到FilterConfig.cs中
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
//filters.Add(new HandleErrorAttribute());
//3. 添加全局過濾器
filters.Add(new Filters.MyActionFilterAttribute());
filters.Add(new Filters.MyHandleErrorAttribute());
}
}
示例:Result過濾器
/// <summary>
/// Result 過濾器 類 - 如果請求的是 要加載視圖的 Action 方法的話
/// 在 視圖加載 前 後 調用方法
/// </summary>
public class MyResultFilterAttribute:System.Web.Mvc.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);
}
}
示例:授權過濾器 - 在 Action過濾器前 執行
/// <summary>
/// 授權過濾器 - 在 Action過濾器前 執行
/// </summary>
public class MyAuthorizeAttribute:AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
filterContext.HttpContext.Response.Write("<br/>OnAuthorization<br/>");
//註釋掉 父類方法,因爲 父類裏的 OnAuthorization 方法會 調用 asp.net的授權驗證機制!
//base.OnAuthorization(filterContext);
}
}
示例:Exception過濾器
/// <summary>
/// 異常處理 過濾器
/// </summary>
public class MyHandleErrorAttribute : 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);
}
}