鍍金池/ 教程/ Java/ MVC框架 - 動作過濾器
MVC框架 - 異常處理
MVC框架架構
MVC框架 ASP.NET表單
MVC框架 - 高級示例
MVC框架 - 捆綁
MVC框架 - 文件夾
MVC框架 - 控制器
MVC框架 - 模型
MVC框架 - 視圖
MVC框架 - 路由引擎
MVC框架 - 第一個應用程序
MVC框架 - AJAX支持
MVC框架教程
MVC框架 - 布局
MVC框架 - 動作過濾器

MVC框架 - 動作過濾器

在ASP.NET MVC中,控制器確定行作方法和動作,這些方法一般是一到一對應于UI控件,例如單擊按鈕或鏈接等,例如,在前面的例子,UserController類包含方法:UserAdd,UserDelete等。

但很多時候,我們希望在特定操作之前或之后執(zhí)行一些動作。為了實現這個功能,ASP.NET MVC提供一個在控制器的action方法添加前置和后置的動作行為的功能。

過濾器的類型

ASP.NET MVC框架支持下列動作過濾器:

  • 動作過濾器:動作過濾器用來實現獲取前一個控制器動作執(zhí)行后執(zhí)行的邏輯。在本章我們將著眼于動作過濾器細節(jié)。
  • 授權過濾器:授權過濾器用于實現對控制器動作的驗證和授權。
  • 結果過濾器:結果過濾器包含之前和視圖結果被執(zhí)行后,執(zhí)行邏輯。例如,可能要修改視圖結果前右視圖呈現給瀏覽器。
  • 異常過濾器:異常過濾器是最后運行的一個類型??梢允褂靡粋€異常過濾器來處理由任何控制器的動作或控制器操作的結果出現的錯誤。 也可以使用異常過濾器來記錄錯誤。

動作過濾器是最常用的過濾器,一個來執(zhí)行額外的數據處理,或操縱的返回值或取消操作,執(zhí)行或在運行時修改視圖的結構。

操作過濾器

動作過濾器附加屬性是可以應用到控制器部分或整個控制器修改,以執(zhí)行動作。這些屬性是特殊的,從System.Attribute派生,.NET類可以附加到類,方法,屬性和字段。

ASP.NET MVC提供了以下行動過濾器:

  • 輸出緩存: 這個動作過濾器緩存控制器的動作在指定的時間量的輸出。
  • 處理錯誤:這個動作過濾器處理的控制器操作執(zhí)行時出現的錯誤。
  • 授權:這個行為過濾器,可以限制訪問特定用戶或角色。

現在,我們將看到的代碼示例,這個例子控制器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();
        }
    }

使用上面的代碼,如果想嘗試不登錄就訪問應用程序,它會拋出類似這樣的錯誤:

mvc_authorize_filter