MVC框架 - 動作過濾器


在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();
        }
    }

使用上面的程式碼,如果想嘗試不登入就存取應用程式,它會丟擲類似這樣的錯誤:

mvc_authorize_filter