在ASP.NET MVC中,控制器確定行作方法和動作,這些方法一般是一到一對應于UI控件,例如單擊按鈕或鏈接等,例如,在前面的例子,UserController類包含方法:UserAdd,UserDelete等。
但很多時候,我們希望在特定操作之前或之后執(zhí)行一些動作。為了實現這個功能,ASP.NET MVC提供一個在控制器的action方法添加前置和后置的動作行為的功能。
ASP.NET MVC框架支持下列動作過濾器:
動作過濾器是最常用的過濾器,一個來執(zhí)行額外的數據處理,或操縱的返回值或取消操作,執(zhí)行或在運行時修改視圖的結構。
動作過濾器附加屬性是可以應用到控制器部分或整個控制器修改,以執(zhí)行動作。這些屬性是特殊的,從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"); } }
例如:應用重定向到一個自定義錯誤頁時,被控制器觸發(fā)錯誤
[HandleError] public class ActionFilterDemoController : Controller { public ActionResult Index() { throw new NullReferenceException(); } public ActionResult About() { return View(); } }
使用上面的代碼,如果操作執(zhí)行過程中的任何錯誤發(fā)生,它會找到一個在瀏覽文件夾命名為錯誤視圖并渲染頁面給用戶。
例如:只允許授權用戶登錄應用
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(); } }
使用上面的代碼,如果想嘗試不登錄就訪問應用程序,它會拋出類似這樣的錯誤: