[VS2010] ASP.NET MVC with Action Filters
什麼是Action Filters呢?action filter是一種屬性,能夠讓你在執行特定的Controller Action或是Controller內所有的Action之前,先去執行一些必要的步驟。例如:發表文章前必需檢查登入狀態。
在ASP.NET MVC中,提供了四種不同介面的action filter:
IActionFilter ─ Action filters 提供action額外的處理動作,例如:提供額外的資料,檢查回傳的值,或是取消action的動作。
IResultFilter ─ Result filters 重新包裝Action Result,可以增加結果的額外處理,像是修改Http的Response。例如:OutputCacheAttribute。
IAuthorizationFilter ─ Authorization flters 權限控管
IExceptionFilter ─ Exception filters 例外處理,指定例外發生時要執行的action,用來記錄log或是顯示錯誤訊息頁面。例如:HandleErrorAttribute。
在MVC專案剛建立的時候,最基本的例子就是HandleErrorAttribute以及AuthorizeAttribute了。
HandleErrorAttribute中,提供了四種基本屬性可以設定:
- ExceptionType:提定處理的意外型別
- View:指定顯示的View
- Master:指定要套用的Master頁面
- Order:指定執行的順序
//套用HandleErrorAttribute
[HandleError(View = "CustomErrorView", ExceptionType = typeof(NotImplementedException))]
public ActionResult ThrowNotImplemented()
{
throw new NotImplementedException();
}
AuthorizeAttribute則提供了關於權限指定的設定:
- Order:指定執行的順序
- Roles;檢查符合的角色
- Users:檢查符合的使用者
//套用AuthorizeAttribute
[Authorize(Roles="Admin")]
public ActionResult ChangePassword()
{
ViewData["PasswordLength"] = MembershipService.MinPasswordLength;
return View();
}
我們也可以自訂自己需要的Action Filter,基本的ActionFilterAttribute提供了四種方法讓我們可以覆寫:OnActionExecuting, OnActionExecuted, OnResultExecuting, OnResultExecuted
執行的順序如下圖:
你就可以利用這個基本的Action Filter來建立一個簡單的Log機制:
public class CustomFilter : ActionFilterAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
Message(filterContext.RouteData);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
Message(filterContext.RouteData);
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
Message(filterContext.RouteData);
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Message(filterContext.RouteData);
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
Message(filterContext.RouteData);
}
public void Message(RouteData route)
{
var controller = route.Values["controller"];
var action = route.Values["action"];
var message = String.Format("controller={0}, action={1}", controller, action);
Debug.WriteLine(message);
}
}
簡單的利用不同的Action Filter,就可以達到控管的機制,是不是很輕鬆呢?
相關連結:
Implementing an Error-Handling Filter
Creating Custom Action Filters