1. 程式人生 > >ASP.NET MVC 重點教程一週年版 第六回 過濾器Filter

ASP.NET MVC 重點教程一週年版 第六回 過濾器Filter

在Asp.netMvc中當你有以下及類似以下需求時你可以使用Filter功能

  1. 判斷登入與否或使用者許可權
  2. 決策輸出快取
  3. 防盜鏈
  4. 防蜘蛛
  5. 本地化與國際化設定 
  6. 實現動態Action

Filter是一種宣告式程式設計方式,在Asp.net MVC中它只能限制於Action(或它的Controller)。
Filter要繼承於ActionFilterAttribute抽象類,並可以覆寫void OnActionExecuting(ActionExecutingContext)和
void OnActionExecuted(ActionExecutedContext)

以及void OnResultExecuting(ResultExecutingContext)和
void OnResultExecuted(ResultExecutedContext)

OnActionExecuting是Action執行前的操作,OnActionExecuted則是Action執行後的操作

而OnResultExecuting是解析ActionResult前執行,OnResultExecuted是解析ActionResult後執行。

一、應用於Action的Filter


下面我給大家一個示例,來看看它的的執行順序
首先我們先建立 一個Filter,名字叫做TestFilter

  public class TestFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
filterContext.HttpContext.Session["temp"] += "TestFilter OnActionExecuting<br/>";
}

public override void OnActionExecuted(ActionExecutedContext filterContext)
{
filterContext.HttpContext.Session["temp
"] += "TestFilter OnActionExecuted<br/>";
}
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Session["temp"] += "TestFilter OnResultExecuting<br/>";
}

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
filterContext.HttpContext.Session["temp"] += "TestFilter OnResultExecuted<br/>";
}
}

然後建立一個Action:

        [TestFilter]//將此Filter應用於Action
public ActionResult filteraction()
{
return View();
}

在它的View中寫入:

<%Session["temp"] += "View Execute<br/>"; %>

最後在其它頁面得到Session["temp"]的輸出結果:

TestFilter OnActionExecuting
TestFilter OnActionExecuted
TestFilter OnResultExecuting
View Execute
TestFilter OnResultExecuted

由此可得到它們的執行順序也是如上

二、Controller的Filter

將Filter應用在Controller上有2種方式

1.直接將Filter應用在Controller上,如:

    [TestFilter]
public class EiceController : Controller
{
}

2.重寫Controller內的
OnActionExecuting/OnActionExecuted/OnResultExecuting/OnResultExecuted的四個方法。

下面我們說幾個系統的Filter

三、AcceptVerbs

規定頁面的訪問形式,如

        [AcceptVerbs(HttpVerbs.Post)]
public ActionResult Example(){
return View();
}


頁面只能以Post形式訪問,即表單提交。

四、ActionName

規定Action的名稱。

應用場景:如果不想用方法名做為Action名,或Action名為關鍵字的話,如

       [ActionName("class")]
public ActionResult Example(){
return View();
}

五、NonAction

當前方法僅是普通方法不解析為Action

六、OutputCache

為Action新增快取

        [OutputCache(Duration = 60, VaryByParam = "*")]
public ActionResult Example()
{
return View();
}

七、ValidateInput

該Action可以接受Html等危險程式碼(ASP.NET MVC在aspx中設定<%@ Page 的屬性無法完成等同任務。)

        [ValidateInput(false)]
public ActionResult Example()
{
return View();
}

八、ValidateAntiForgeryTokenAttribute

用於驗證伺服器篡改。

        [ValidateAntiForgeryToken]
public ActionResult Example()
{
return View();
}