Objaśnienie filtrów akcji (C#)
autor: Microsoft
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).
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:
- Filtry autoryzacji — implementuje
IAuthorizationFilter
atrybut . - Filtry akcji — implementuje
IActionFilter
atrybut . - Filtry wyników — implementuje
IResultFilter
atrybut . - 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 IAuthorizationFilter
interfejs , IActionFilter
, IResultFilter
lub 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).
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.