在ASP.NET MVC中,控制器確定行作方法和動作,這些方法一般是一到一對應於UI控制元件,例如單擊按鈕或連結等,例如,在前面的例子,UserController類包含方法:UserAdd,UserDelete等。
但很多時候,我們希望在特定操作之前或之後執行一些動作。為了實現這個功能,ASP.NET MVC提供一個在控制器的action方法新增前置和後置的動作行為的功能。
ASP.NET MVC框架支援下列動作過濾器:
動作過濾器是最常用的過濾器,一個來執行額外的資料處理,或操縱的返回值或取消操作,執行或在執行時修改檢視的結構。
動作過濾器附加屬性是可以應用到控制器部分或整個控制器修改,以執行動作。這些屬性是特殊的,從System.Attribute派生,.NET類可以附加到類,方法,屬性和欄位。
ASP.NET MVC提供了以下行動過濾器:
現在,我們將看到的程式碼範例,這個例子控制器ActionFilterDemoController應用這些過濾器。(ActionFilterDemoController只是作為一個例子,可以在任何控制器使用這些過濾器。)
例如:指定的返回值被快取10秒。
public class ActionFilterDemoController : Controller { [HttpGet] OutputCache(Duration = 10)] public string Index() { return DateTime.Now.ToString("T"); } }
例如:應用重定向到一個自定義錯誤頁時,被控制器觸發錯誤
[HandleError] public class ActionFilterDemoController : Controller { public ActionResult Index() { throw new NullReferenceException(); } public ActionResult About() { return View(); } }
使用上面的程式碼,如果操作執行過程中的任何錯誤發生,它會找到一個在瀏覽檔案夾命名為錯誤檢視並渲染頁面給使用者。
例如:只允許授權使用者登入應用
public class ActionFilterDemoController: Controller { [Authorize] public ActionResult Index() { ViewBag.Message = "This can be viewed only by authenticated users only"; return View(); } [Authorize(Roles="admin")] public ActionResult AdminIndex() { ViewBag.Message = "This can be viewed only by users in Admin role only"; return View(); } }
使用上面的程式碼,如果想嘗試不登入就存取應用程式,它會丟擲類似這樣的錯誤: