ASP.NET MVC筆記 之 Action 過濾器

iDotNetSpace發表於2009-04-09
 Action 過濾器在程式碼中體現為新增到Action上方的屬性,MVC框架包含了一些過濾器,如:
    OutputCache –指示Controller在指定時間內快取返回的結果。
    HandleError –處理Contrller中Action丟擲的異常
    Authorize – 約束特定使用者或角色對Action的訪問
    另外你還可以自己定義過濾器,比如:你想使用自定義的驗證機制;你想修改Action返回的資料等等。
    使用Action 過濾器
     Action 過濾器不僅可以控制單個Action,也可以控制整個Contrller。同時,一個Action可以應用多個過濾器。比如:
<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gtpublic class DataController : Controller
{
   [OutputCache(Duration
=10)]
   
public string Index()
   {
       
return DateTime.Now.ToString("T");
   }
}

這個Action返回了當前時間,但是你若在10秒鐘內重新整理介面,你會一直得到同一個值,因為這裡使用了OutputCache(Duration=10)
    過濾器的型別
    ASP.NET MVC 框架支援以下幾種過濾器:
    1、Authorization 過濾器– 實現了 IAuthorizationFilter 介面。這一類的過濾器用來實現使用者驗證和對Action的訪問授權。比如Authorize 就屬於Authorization 過濾器。
    2、Action 過濾器– 實現了 IActionFilter 介面。它可以包含一些Action執行前或者執行後的邏輯,比如有一些過濾器專門用來修改Action返回的資料。
    3、Result 過濾器– 實現了 IResultFilter 介面。它可以包含一些view result生成前或者生成後的邏輯,比如有一些過濾器專門用來修改檢視向瀏覽器展現前的結果。
    4、Exception 過濾器– 實現了IExceptionFilter 介面。它用以用來處理Action或者Result的錯誤,也可以記錄錯誤。
    過濾器的預設執行順序也和上面的列表相同,比如Authorization 過濾器會先於Action 過濾器執行,而Exception 過濾器總會在最後執行。當然你也可以根據需要通過Order屬性設定過濾器執行的順序。
    自定義過濾器
    自定義過濾器必須繼承System.Web.Mvc.FilterAttribute ,並且實現上述幾個介面中的一個或者多個。MVC框架為了方便開發人員,預定義了一個ActionFilterAttribute 類,它已實現了IActionFilter 和IResultFilter 介面。你可以過載ActionFilterAttribute 類中以下幾個方法:
OnActionExecuting – 在Action執行之前呼叫。
OnActionExecuted – 在Action執行之後呼叫。
OnResultExecuting – 在Result產生之前呼叫。
OnResultExecuted – 在Result產生之前呼叫。
下面示例一個類:    

Code

將LogActionFilter冠在某一個Action或者Controller上,就會列印對應Action的執行情況。如:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt     [LogActionFilter]
     
public class HomeController : Controller
     {}

OutputCache過濾器
      你可以使用OutputCache過濾器來快取的你查詢結果,這樣可以提高使用者體驗,也可以減少查詢次數。它有以下屬性:
Duration:快取的時間,以秒為單位,理論上快取時間可以很長,但實際上當系統資源緊張時,快取空間還是會被系統收回。
VaryByParam:以哪個欄位為標識來快取資料,比如當“ID”欄位變化時,需要改變快取(仍可保留原來的快取),那麼應該設VaryByParam為"ID"。這裡你可以設定以下幾個值:
* = 任何引數變化時,都改變快取。
none = 不改變快取。
以分號“;”為間隔的欄位名列表 = 列表中的欄位發生變化,則改變快取。

Location:快取資料放在何處。快取位置很重要,如果存在伺服器上,那麼所有使用者看到的快取檢視都會一樣,如果存在客戶端,那麼使用者只會看到自己的快取。比如:如果是一些私人資訊,那就不能存在伺服器上。你可以設定以下值:
· Any :預設值,輸出快取可位於產生請求的瀏覽器客戶端、參與請求的代理伺服器(或任何其他伺服器)或處理請求的伺服器上。

· Client:輸出快取位於產生請求的瀏覽器客戶端上。

· Downstream 輸出快取可儲存在任何 HTTP 1.1 可快取裝置中,源伺服器除外。這包括代理伺服器和發出請求的客戶端。

· Server:輸出快取位於處理請求的 Web 伺服器上。

· None:對於請求的頁,禁用輸出快取。

· ServerAndClient:輸出快取只能儲存在源伺服器或發出請求的客戶端中。代理伺服器不能快取響應。

NoStore:該屬性定義一個布林值,用於決定是否阻止敏感資訊的二級儲存。
除了直接在Action或者類的定義前加上屬性,也可以使用配置檔案,這樣就可以動態配置你的快取模式了。
節中,新增如下配置:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt<caching>
<outputCacheSettings>
    
<outputCacheProfiles>
        
<add name="Cache1Hour" duration="3600" varyByParam="none"/>
    
outputCacheProfiles>
outputCacheSettings>
caching>

那麼在Controller中可以這樣使用:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt[OutputCache(CacheProfile="Cache1Hour")]
public string Index()
{
   return DateTime.Now.ToString("T");
}

[擴充套件]在已經快取的頁面上新增動態內容
為了提高使用者體驗,我們會使用快取技術,但是有時我們會需要在頁面上改變內容,如:提供一些動態資訊、廣告的變化等。
此時我們可以呼叫 HttpResponse.WriteSubstitution() 方法。
例如:

 

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt Response.WriteSubstitution(News.RenderNews); %>

其中News.RenderNews是一個靜態方法,它的定義如下,這個方法用來隨機顯示三條廣告詞。   

Code

你甚至可以為Response.WriteSubstitution()方法擴充套件一個Helper方法,如下所示:

Code

那麼你就可以在頁面上如此呼叫:

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt  Html.RenderBanner(); %>

這樣就會每重新整理一次頁,改變一次影像。但是資料內容卻還是快取的,並不會因為你重新整理了頁面而再次查詢資料庫。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-586870/,如需轉載,請註明出處,否則將追究法律責任。

相關文章