ASP.NET MVC筆記 之 Action 過濾器
OutputCache –指示Controller在指定時間內快取返回的結果。
HandleError –處理Contrller中Action丟擲的異常
Authorize – 約束特定使用者或角色對Action的訪問
另外你還可以自己定義過濾器,比如:你想使用自定義的驗證機制;你想修改Action返回的資料等等。
使用Action 過濾器
Action 過濾器不僅可以控制單個Action,也可以控制整個Contrller。同時,一個Action可以應用多個過濾器。比如:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public 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
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public class LogActionFilter : ActionFilterAttribute
{
public override void OnActionExecuting
(ActionExecutingContext filterContext)
{
Log("OnActionExecuting", filterContext.RouteData);
}
public override void OnActionExecuted
(ActionExecutedContext filterContext)
{
Log("OnActionExecuted", filterContext.RouteData);
}
public override void OnResultExecuting
(ResultExecutingContext filterContext)
{
Log("OnResultExecuting", filterContext.RouteData);
}
public override void OnResultExecuted
(ResultExecutedContext filterContext)
{
Log("OnResultExecuted", filterContext.RouteData);
}
private void Log(string methodName, RouteData routeData)
{
var controllerName = routeData.Values["controller"];
var actionName = routeData.Values["action"];
var message = String.Format("{0} controller:{1} action:{2}", methodName, controllerName, actionName);
Debug.WriteLine(message, "Action Filter Log");
}
}
將LogActionFilter冠在某一個Action或者Controller上,就會列印對應Action的執行情況。如:
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> [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/
--><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/
-->[OutputCache(CacheProfile="Cache1Hour")]
public string Index()
{
return DateTime.Now.ToString("T");
}
[擴充套件]在已經快取的頁面上新增動態內容
為了提高使用者體驗,我們會使用快取技術,但是有時我們會需要在頁面上改變內容,如:提供一些動態資訊、廣告的變化等。
此時我們可以呼叫 HttpResponse.WriteSubstitution() 方法。
例如:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> Response.WriteSubstitution(News.RenderNews); %>
其中News.RenderNews是一個靜態方法,它的定義如下,這個方法用來隨機顯示三條廣告詞。
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public class News
{
public static string RenderNews(HttpContext context)
{
var news = new List<string>
{
"Gas prices go up!",
"Life discovered on Mars!",
"Moon disappears!"
};
var rnd = new Random();
return news[rnd.Next(news.Count)];
}
}
你甚至可以為Response.WriteSubstitution()方法擴充套件一個Helper方法,如下所示:
Code
<!--
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->public static class AdHelper
{
public static void RenderBanner(this HtmlHelper helper)
{
var context = helper.ViewContext.HttpContext;
context.Response.WriteSubstitution(RenderBannerInternal);
}
private static string RenderBannerInternal(HttpContext context)
{
var ads = new List<string>
{
"/ads/banner1.gif",
"/ads/banner2.gif",
"/ads/banner3.gif"
};
var rnd = new Random();
var ad = ads[rnd.Next(ads.Count)];
return String.Format("", ad);
}
}
那麼你就可以在頁面上如此呼叫:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--> Html.RenderBanner(); %>
這樣就會每重新整理一次頁,改變一次影像。但是資料內容卻還是快取的,並不會因為你重新整理了頁面而再次查詢資料庫。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-586870/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- asp.net core MVC 過濾器之ActionFilter過濾器(二)ASP.NETMVC過濾器Filter
- ASP.Net MVC過濾器ASP.NETMVC過濾器
- ASP.NET MVC動作過濾器ASP.NETMVC過濾器
- .Net MVC中定義全域性過濾器及在Action中排除全域性過濾器MVC過濾器
- 【ASP.NET Core】MVC過濾器:執行流程ASP.NETMVC過濾器
- 【ASP.NET Core】MVC過濾器:常見用法ASP.NETMVC過濾器
- ASP.Net MVC開發基礎學習筆記(4):校驗、AJAX與過濾器ASP.NETMVC筆記過濾器
- mvc原始碼解讀(11)-mvc四大過濾器之AuthorizationFilterMVC原始碼過濾器Filter
- mvc原始碼解讀(12)-mvc四大過濾器之ActionFilterMVC原始碼過濾器Filter
- mvc原始碼解讀(13)-MVC四大過濾器之ResultFilterMVC原始碼過濾器Filter
- mvc原始碼解讀(14)-mvc四大過濾器之ExceptionFilterMVC原始碼過濾器ExceptionFilter
- 筆記:ASP.NET MVC安全筆記ASP.NETMVC
- ASP.NET Core 過濾器ASP.NET過濾器
- ASP.NET MVC 5呼叫其他ActionASP.NETMVC
- asp.net mvc中的使用者登入驗證過濾器ASP.NETMVC過濾器
- ASP.NET MVC 5改進了基於過濾器的身份驗證ASP.NETMVC過濾器
- angular學習筆記(十六) -- 過濾器(1)Angular筆記過濾器
- angular學習筆記(十六) -- 過濾器(2)Angular筆記過濾器
- hbase權威指南閱讀隨手筆記二之過濾器筆記過濾器
- 協同過濾筆記筆記
- vue 基礎入門筆記 07:過濾器Vue筆記過濾器
- LevelDB 學習筆記1:布隆過濾器筆記過濾器
- 理解ASP.NET Core - 過濾器(Filters)ASP.NET過濾器Filter
- ASP.Net Core 5.0 MVC中AOP思想的體現(五種過濾器)並結合專案案例說明過濾器的用法ASP.NETMVC過濾器
- asp.net mvc get controller name and action nameASP.NETMVCController
- asp.net mvc原始碼分析-Action篇 DefaultModelBinderASP.NETMVC原始碼
- MVC使用異常過濾器處理異常MVC過濾器
- 008-讀書筆記-Vue官網 過濾器筆記Vue過濾器
- ASP.NET MVC學習筆記:(一)路由匹配ASP.NETMVC筆記路由
- Asp.net core 過濾器的簡單使用ASP.NET過濾器
- Google瀏覽器外掛之快閃記憶體過濾器Go瀏覽器記憶體過濾器
- ASP.Net MVC開發基礎學習筆記(1):走向MVC模式ASP.NETMVC筆記模式
- 過濾Servlet--過濾器Servlet過濾器
- [ASP.NET MVC 小牛之路]09 - Controller 和 Action (1)ASP.NETMVCController
- [ASP.NET MVC 小牛之路]10 - Controller 和 Action (2)ASP.NETMVCController
- [ASP.NET MVC 小牛之路]12 - Section、Partial View 和 Child ActionASP.NETMVCView
- jQuery IN ACTION 小筆記jQuery筆記
- Spring Cloud Gateway 之 過濾器SpringCloudGateway過濾器