Objaśnienie filtrów akcji (C#)

autor: Microsoft

Pobierz plik PDF

Celem tego samouczka jest wyjaśnienie filtrów akcji. Filtr akcji to atrybut, który można zastosować do akcji kontrolera — lub całego kontrolera — który modyfikuje sposób wykonywania akcji.

Opis filtrów akcji

Celem tego samouczka jest wyjaśnienie filtrów akcji. Filtr akcji to atrybut, który można zastosować do akcji kontrolera — lub całego kontrolera — który modyfikuje sposób wykonywania akcji. Struktura ASP.NET MVC zawiera kilka filtrów akcji:

  • OutputCache — ten filtr akcji buforuje dane wyjściowe akcji kontrolera przez określony czas.
  • HandleError — ten filtr akcji obsługuje błędy zgłaszane podczas wykonywania akcji kontrolera.
  • Autoryzowanie — ten filtr akcji umożliwia ograniczenie dostępu do określonego użytkownika lub roli.

Możesz również utworzyć własne filtry akcji niestandardowych. Na przykład można utworzyć niestandardowy filtr akcji w celu zaimplementowania niestandardowego systemu uwierzytelniania. Możesz też utworzyć filtr akcji, który modyfikuje dane widoku zwracane przez akcję kontrolera.

Z tego samouczka dowiesz się, jak utworzyć filtr akcji od podstaw. Tworzymy filtr akcji Dziennik, który rejestruje różne etapy przetwarzania akcji w oknie Dane wyjściowe programu Visual Studio.

Używanie filtru akcji

Filtr akcji jest atrybutem. Większość filtrów akcji można zastosować do pojedynczej akcji kontrolera lub całego kontrolera.

Na przykład kontroler danych na liście 1 uwidacznia akcję o nazwie Index() zwracającą bieżący czas. Ta akcja jest ozdobiona filtrem OutputCache akcji. Ten filtr powoduje buforowanie wartości zwróconej przez akcję przez 10 sekund.

Lista 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");
          }
     }
}

Jeśli wielokrotnie wywołujesz Index() akcję, wprowadzając adres URL /Data/Index na pasku adresu przeglądarki i naciskając przycisk Odśwież wiele razy, zobaczysz ten sam czas przez 10 sekund. Dane wyjściowe Index() akcji są buforowane przez 10 sekund (zobacz Rysunek 1).

Czas buforowany

Rysunek 01. Czas buforowania (kliknij, aby wyświetlić obraz w pełnym rozmiarze)

Na liście 1 do metody jest stosowany filtr pojedynczej Index() akcji — OutputCache filtr akcji. Jeśli potrzebujesz, możesz zastosować wiele filtrów akcji do tej samej akcji. Na przykład można zastosować filtry akcji i HandleError do OutputCache tej samej akcji.

Na liście 1 OutputCache filtr akcji jest stosowany do Index() akcji. Można również zastosować ten atrybut do DataController samej klasy. W takim przypadku wynik zwrócony przez każdą akcję uwidoczniną przez kontroler będzie buforowany przez 10 sekund.

Różne typy filtrów

Platforma ASP.NET MVC obsługuje cztery różne typy filtrów:

  1. Filtry autoryzacji — implementuje IAuthorizationFilter atrybut .
  2. Filtry akcji — implementuje IActionFilter atrybut .
  3. Filtry wyników — implementuje IResultFilter atrybut .
  4. Filtry wyjątków — implementuje IExceptionFilter atrybut .

Filtry są wykonywane w kolejności wymienionej powyżej. Na przykład filtry autoryzacji są zawsze wykonywane przed filtrami akcji, a filtry wyjątków są zawsze wykonywane po każdym innym typie filtru.

Filtry autoryzacji służą do implementowania uwierzytelniania i autoryzacji dla akcji kontrolera. Na przykład filtr Autoryzuj jest przykładem filtru autoryzacji.

Filtry akcji zawierają logikę wykonywaną przed wykonaniem akcji kontrolera i po jej wykonaniu. Możesz na przykład użyć filtru akcji, aby zmodyfikować dane widoku zwracane przez akcję kontrolera.

Filtry wyników zawierają logikę, która jest wykonywana przed wykonaniem wyniku widoku i po nim. Na przykład możesz zmodyfikować wynik widoku bezpośrednio przed renderowaniem widoku w przeglądarce.

Filtry wyjątków to ostatni typ filtru do uruchomienia. Filtr wyjątków umożliwia obsługę błędów zgłaszanych przez akcje kontrolera lub wyniki akcji kontrolera. Możesz również użyć filtrów wyjątków, aby rejestrować błędy.

Każdy inny typ filtru jest wykonywany w określonej kolejności. Jeśli chcesz kontrolować kolejność wykonywania filtrów tego samego typu, możesz ustawić właściwość Order filtru.

Klasa bazowa dla wszystkich filtrów akcji jest klasą System.Web.Mvc.FilterAttribute . Jeśli chcesz zaimplementować określony typ filtru, musisz utworzyć klasę dziedziczą po klasie filtru podstawowego i implementuje co najmniej jeden IAuthorizationFilterinterfejs , IActionFilter, IResultFilterlub IExceptionFilter .

Klasa Base ActionFilterAttribute

Aby ułatwić zaimplementowanie niestandardowego filtru akcji, platforma ASP.NET MVC zawiera klasę bazową ActionFilterAttribute . Ta klasa implementuje interfejsy IActionFilter i IResultFilter i dziedziczy z Filter klasy .

Terminologia w tym miejscu nie jest całkowicie spójna. Technicznie klasa dziedziczona z klasy ActionFilterAttribute jest zarówno filtrem akcji, jak i filtrem wyników. Jednak w luźnym sensie filtr akcji słowa jest używany do odwoływania się do dowolnego typu filtru w strukturze ASP.NET MVC.

Klasa bazowa ActionFilterAttribute ma następujące metody, które można zastąpić:

  • OnActionExecuting — ta metoda jest wywoływana przed wykonaniem akcji kontrolera.
  • OnActionExecuted — ta metoda jest wywoływana po wykonaniu akcji kontrolera.
  • OnResultExecuting — ta metoda jest wywoływana przed wykonaniem wyniku akcji kontrolera.
  • OnResultExecuted — ta metoda jest wywoływana po wykonaniu wyniku akcji kontrolera.

W następnej sekcji zobaczymy, jak można zaimplementować każdą z tych różnych metod.

Tworzenie filtru akcji dziennika

Aby zilustrować sposób tworzenia filtru akcji niestandardowej, utworzymy niestandardowy filtr akcji, który rejestruje etapy przetwarzania akcji kontrolera w oknie Dane wyjściowe programu Visual Studio. Nasz LogActionFilter jest zawarty w liście 2.

Lista 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");
          }

     }
}

Na liście 2 metody OnActionExecuting(), OnActionExecuted(), OnResultExecuting()i OnResultExecuted() wszystkie wywołają metodę Log() . Nazwa metody i bieżące dane trasy są przekazywane do Log() metody . Metoda Log() zapisuje komunikat w oknie Dane wyjściowe programu Visual Studio (zobacz Rysunek 2).

Zapisywanie w oknie Danych wyjściowych programu Visual Studio

Rysunek 02. Zapisywanie w oknie danych wyjściowych programu Visual Studio (kliknij, aby wyświetlić obraz pełnowymiarowy)

Kontroler główny na liście 3 ilustruje, jak można zastosować filtr akcji Dziennik do całej klasy kontrolera. Za każdym razem, gdy dowolne akcje uwidocznione przez kontroler home są wywoływane — Index() metoda lub About() metoda — etapy przetwarzania akcji są rejestrowane w oknie dane wyjściowe programu Visual Studio.

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

Podsumowanie

W tym samouczku przedstawiono ASP.NET filtrów akcji MVC. Przedstawiono cztery różne typy filtrów: filtry autoryzacji, filtry akcji, filtry wyników i filtry wyjątków. Przedstawiono również informacje o klasie bazowej ActionFilterAttribute .

Na koniec przedstawiono sposób implementowania prostego filtru akcji. Utworzyliśmy filtr akcji Dziennik, który rejestruje etapy przetwarzania akcji kontrolera w oknie Dane wyjściowe programu Visual Studio.