Sdílet prostřednictvím


Principy filtrů akcí (C#)

od Microsoftu

Stáhnout PDF

Cílem tohoto kurzu je vysvětlit filtry akcí. Filtr akcí je atribut, který můžete použít na akci kontroleru – nebo na celý kontroler – a který mění způsob, jakým se akce provádí.

Principy filtrů akcí

Cílem tohoto kurzu je vysvětlit filtry akcí. Filtr akcí je atribut, který můžete použít na akci kontroleru – nebo na celý kontroler – a který mění způsob, jakým se akce provádí. Architektura ASP.NET MVC obsahuje několik filtrů akcí:

  • OutputCache – tento filtr akce ukládá výstup akce kontroleru do mezipaměti po zadanou dobu.
  • HandleError – tento filtr akce zpracovává chyby vyvolané při spuštění akce kontroleru.
  • Autorizovat – tento filtr akce umožňuje omezit přístup ke konkrétnímu uživateli nebo roli.

Můžete také vytvořit vlastní filtry akcí. Můžete například vytvořit vlastní filtr akcí, abyste mohli implementovat vlastní ověřovací systém. Nebo můžete chtít vytvořit filtr akcí, který upraví data zobrazení vrácená akcí kontroleru.

V tomto kurzu se naučíte, jak vytvořit filtr akcí od základů. Vytvoříme filtr akce protokolu, který protokoluje různé fáze zpracování akce do okna Výstup sady Visual Studio.

Použití filtru akcí

Filtr akcí je atribut. Většinu filtrů akcí můžete použít buď na jednotlivé akce kontroleru, nebo na celý kontroler.

Například kontroler dat v seznamu 1 zveřejňuje akci s názvem Index() , která vrací aktuální čas. Tato akce je zdobena filtrem OutputCache akcí. Tento filtr způsobí, že se hodnota vrácená akcí uloží do mezipaměti po dobu 10 sekund.

Výpis 1 – Controllers\DataController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
     public class DataController : Controller
     {
          [OutputCache(Duration=10)]
          public string Index()
          {
               return DateTime.Now.ToString("T");
          }
     }
}

Pokud akci opakovaně vyvoláte Index() tak, že do adresního řádku prohlížeče zadáte adresu URL /Data/Index a několikrát stisknete tlačítko Aktualizovat, zobrazí se stejná doba po dobu 10 sekund. Výstup Index() akce se ukládá do mezipaměti po dobu 10 sekund (viz obrázek 1).

Čas uložený v mezipaměti

Obrázek 01: Čas uložený v mezipaměti (kliknutím zobrazíte obrázek v plné velikosti)

Ve výpisu 1 se na Index() metodu OutputCache použije jeden filtr akce – filtr akcí. Pokud potřebujete, můžete na stejnou akci použít více filtrů akcí. Můžete například chtít použít filtry OutputCache akcí i HandleError pro stejnou akci.

V seznamu 1 OutputCache se na Index() akci použije filtr akcí. Tento atribut můžete také použít pro DataController samotnou třídu. V takovém případě by výsledek vrácený jakoukoli akcí vystavenou kontrolerem byl uložen do mezipaměti po dobu 10 sekund.

Různé typy filtrů

Architektura ASP.NET MVC podporuje čtyři různé typy filtrů:

  1. Filtry autorizace – implementuje IAuthorizationFilter atribut.
  2. Filtry akcí – implementuje IActionFilter atribut.
  3. Filtry výsledků – Implementuje IResultFilter atribut.
  4. Filtry výjimek – implementuje IExceptionFilter atribut.

Filtry se spouštějí v pořadí uvedeném výše. Například filtry autorizace se vždy spouštějí před filtry akcí a filtry výjimek se vždy spouštějí po každém druhém typu filtru.

Filtry autorizace se používají k implementaci ověřování a autorizace pro akce kontroleru. Příkladem filtru Autorizace je například filtr Autorizace.

Filtry akcí obsahují logiku, která se spouští před a po provedení akce kontroleru. Filtr akcí můžete použít například k úpravě dat zobrazení, která vrátí akce kontroleru.

Filtry výsledků obsahují logiku, která se spouští před a po spuštění výsledku zobrazení. Můžete například chtít upravit výsledek zobrazení těsně před zobrazením zobrazení v prohlížeči.

Filtry výjimek jsou posledním typem filtru, který se má spustit. Filtr výjimek můžete použít ke zpracování chyb vyvolaných akcemi kontroleru nebo výsledky akcí kontroleru. K protokolování chyb můžete také použít filtry výjimek.

Každý jiný typ filtru se spouští v určitém pořadí. Pokud chcete řídit pořadí, ve kterém se budou filtry stejného typu spouštět, můžete nastavit vlastnost Order filtru.

Základní třídou pro všechny filtry akcí je System.Web.Mvc.FilterAttribute třída. Pokud chcete implementovat určitý typ filtru, musíte vytvořit třídu, která dědí ze základní třídy Filter a implementuje jedno nebo více IAuthorizationFilterrozhraní , IActionFilter, IResultFilternebo IExceptionFilter .

The Base ActionFilterAttribute – třída

Aby bylo možné usnadnit implementaci vlastního filtru akcí, ASP.NET rozhraní MVC obsahuje základní ActionFilterAttribute třídu. Tato třída implementuje rozhraní a IActionFilterIResultFilter a dědí z Filter třídy.

Terminologie zde není zcela konzistentní. Technicky vzato je třída, která dědí z třídy ActionFilterAttribute, filtr akcí i filtr výsledků. Ve volném smyslu se však filtr slovem action používá k odkazování na jakýkoli typ filtru v architektuře ASP.NET MVC.

Základní ActionFilterAttribute třída obsahuje následující metody, které můžete přepsat:

  • OnActionExecuting – Tato metoda je volána před spuštěním akce kontroleru.
  • OnActionExecuted – tato metoda je volána po provedení akce kontroleru.
  • OnResultExecuting – tato metoda je volána před provedením výsledku akce kontroleru.
  • OnResultExecuted – Tato metoda je volána po provedení výsledku akce kontroleru.

V další části uvidíme, jak můžete implementovat každou z těchto různých metod.

Vytvoření filtru akcí protokolu

Abychom si ukázali, jak můžete vytvořit filtr vlastních akcí, vytvoříme vlastní filtr akcí, který zaznamená fáze zpracování akce kontroleru do okna Výstup sady Visual Studio. Naše LogActionFilter je obsaženo ve výpisu 2.

Výpis 2 – ActionFilters\LogActionFilter.cs

using System;
using System.Diagnostics;
using System.Web.Mvc;
using System.Web.Routing;

namespace MvcApplication1.ActionFilters
{
     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");
          }

     }
}

Ve výpisu OnActionExecuting()2 volají všechny metody , OnActionExecuted()OnResultExecuting(), a OnResultExecuted() metodu Log() . Do metody se předá Log() název metody a aktuální data trasy. Metoda Log() zapíše zprávu do okna Výstup sady Visual Studio (viz obrázek 2).

Zápis do okna Výstup sady Visual Studio

Obrázek 02: Zápis do okna Výstup sady Visual Studio (kliknutím zobrazíte obrázek v plné velikosti)

Domovský kontroler v seznamu 3 ukazuje, jak můžete použít filtr akce protokolu na celou třídu kontroleru. Při každém vyvolání některé z akcí vystavených kontrolerem Domů – buď Index() metodou, nebo About() metodou – se fáze zpracování akce zaprotokolují do okna Výstup sady Visual Studio.

Výpis 3 – Controllers\HomeController.cs

using System.Web.Mvc;
using MvcApplication1.ActionFilters;

namespace MvcApplication1.Controllers
{
     [LogActionFilter]
     public class HomeController : Controller
     {
          public ActionResult Index()
          {
               return View();
          }

          public ActionResult About()
          {
               return View();
          }
     }
}

Souhrn

V tomto kurzu jste se seznámili s ASP.NET filtry akcí MVC. Dozvěděli jste se o čtyřech různých typech filtrů: autorizační filtry, filtry akcí, filtry výsledků a filtry výjimek. Dozvěděli jste se také o základní ActionFilterAttribute třídě.

Nakonec jste se naučili implementovat jednoduchý filtr akcí. Vytvořili jsme filtr akce protokolu, který zaznamenává fáze zpracování akce kontroleru do okna Výstup sady Visual Studio.