ASP.NET MVC Filters

Introduction

Filter 是在 mvc 中針對 Action 提供的一種屬性(Attribute),可以針對 Action 的動作加以限制,或著是將重複的部分分離出來(IoC),例如說 AuthorizeAttribute 就蠻有代表性的,在進入 Action 之前就限制登入的動作。

可以在三個地方加入 Filter 。

image

▲把整個 Controler 都加入 Filter 的過濾之中

image

▲針對 Action 加入

image

▲在 Global.asax 加入全域的 Filter

就算在三個地方都全加,也只會被執行到一次。

Default FilterAttributes

System.Web.Mvc.ActionFilterAttribute
System.Web.Mvc.AuthorizeAttribute
System.Web.Mvc.ChildActionOnlyAttribute
System.Web.Mvc.HandleErrorAttribute
System.Web.Mvc.RequireHttpsAttribute
System.Web.Mvc.ValidateAntiForgeryTokenAttribute
System.Web.Mvc.ValidateInputAttribute

內建 FilterAttributes 都繼承 FilterAttribute 這個 baseClass

Customize FilterAttribute

除了預設的幾種 FilterAttribute 微軟也提供了幾個 Interface 來自訂 FilterAttribute

IActionFilter
IResultFilter
IAuthorizationFilter
IExceptionFilter

在這邊實作一個可以讓 browser 參數傳入當作 action 的參數。

image

▲如果 Parameter 已經加入過 Key 的參數,會被告知重複的 key 值無法加入

image

▲這邊在 Filter 裡面設定的參數被傳入 Action。

FilterAttribute Life Cycle

OnAuthorization
OnActionExecuting
Action
OnActionExecuted
OnResultExecuting
OnResultExecuted

這邊是 Filter 的執行順序,Action 就是進入 Action 的時間點。下面是用來產出 Life Cycle 的程式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NLog;

namespace Simon.UI.Mvc.Controllers.Filters
{
public class CustomizeActionFilter :FilterAttribute,
IActionFilter, IAuthorizationFilter,
IResultFilter, IExceptionFilter
{
private static Logger logger =
LogManager.GetCurrentClassLogger();
public void OnActionExecuted(
ActionExecutedContext filterContext)
{
logger.Trace("OnActionExecuted");
}

public void OnActionExecuting(
ActionExecutingContext filterContext)
{
logger.Trace("OnActionExecuting");
}

public void OnResultExecuted(
ResultExecutedContext filterContext)
{
logger.Trace("OnResultExecuted");
}

public void OnResultExecuting(
ResultExecutingContext filterContext)
{
logger.Trace("OnResultExecuting");
}

public void OnAuthorization(
AuthorizationContext filterContext)
{
logger.Trace("OnAuthorization");
}

public void OnException(
ExceptionContext filterContext)
{
logger.Trace("OnActionExecuted");
}
}
}

Reference

理解Action Filter

http://hi.baidu.com/grayworm/blog/item/11ec9b13e7ccdc055aaf538f.html

[C#][ASP.NET MVC]自訂Action Filter

http://www.dotblogs.com.tw/ricochen/archive/2010/03/17/14076.aspx

[VS2010] ASP.NET MVC with Action Filters

http://www.dotblogs.com.tw/alonstar/archive/2010/01/19/13100.aspx

MSDN

http://msdn.microsoft.com/en-us/library/dd493051.aspx

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *