[VS2010] ASP.NET MVC with Action Filters

[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了。

image

 

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

執行的順序如下圖:

image

你就可以利用這個基本的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);
    }
}

image

 

 

簡單的利用不同的Action Filter,就可以達到控管的機制,是不是很輕鬆呢?

 

相關連結:

Implementing an Error-Handling Filter

Creating Custom Action Filters

Understanding Action Filters