Prowadząc szkolenie z ASP.NET MVC, zauważyłem, że kursanci rzadko używają filtrów akcji ASP.NET MVC (przede wszystkim tworzą własne) – dlatego chciałem poruszyć ten temat. Wielokrotnie widziałem w różnych projektach sytuacje, w których każda akcja w kontrolerze zawierała na swoim początku identyczny kod (na ogół kilka linijek, ale widziałem też kod o długości 35 linijek :D). Za każdym razem tworzenie nowej akcji sprowadzało się w pierwszym kroku do skopiowania początku z innej akcji. W niektórych sytuacjach kod właściwy akcji był dużo krótszy niż ten wspólny kod.
W takich sytuacjach idealnie sprawdzają się filtry akcji. W kolejnych wpisach pokażę przykładowe własne filtry akcji. 🙂
Czym są filtry akcji?
Microsoft w ASP.NET MVC udostępnił mechanizm, który umożliwia wykonanie kawałka kodu w trakcie obsługi żądania (wykonania akcji w kontrolerze). Co fajne, mechanizm ten działa w sposób deklaratywny i możemy, na przykład, powiedzieć, że ta sama logika ma zostać wykonana dla każdej akcji czy wszystkich kontrolerów w aplikacji (to wszystko za pomocą jednej linijki kodu).
Jakie są typy filtrów akcji ASP.NET MVC?
Do dyspozycji mamy 4 typy filtrów:
- Authorization – logika uwierzytelnia i autoryzacji – uruchamiana przed wykonaniem akcji – możemy np. zablokować dostęp do akcji dla użytkownika, który nie ma określonych uprawnień
- Action – logika odpalana przed wykonaniem akcji i po jej wykonaniu (ale jeszcze przed wykonaniem wyniku akcji, np. wygenerowaniem widoku)
- Result – logika odpalana przed wykonaniem wyniku akcji i po wykonaniu go (po wygenerowaniu widoku)
- Exception – logika odpalana tylko w momencie, gdy wystąpił błąd.
W ASP.NET MVC filtry akcji zostały zaimplementowane w formie atrybutów, którymi dekorujemy akcje w kontrolerze lub sam kontroler.
Wbudowane filtry akcji
Microsoft udostępnia nam kilka wbudowanych filtrów akcji, dostarczonych razem z samym ASP.NET MVC. Są to między innymi (w nawiasie typ filtra):
- Authorize (Authorization) – możliwość określania, jaka rola lub użytkownik ma uprawnienie do wykonania akcji
- RequireHttps (Authorization) – określa wymaganie użycia protokołu HTTPS do obsługi żądania – na przykład aby nie przesyłać loginu i hasła przez sieć jawnym tekstem
- OutputCache (Result) – cache dla wyników akcji – np. wygenerowany widok, dzięki czemu aplikacja działa szybciej
- HandleError (Exception) – służy do obsługi nieobsłużonych wyjątków i wyświetlenia ładnej strony z informacją o błędzie zamiast na przykład ekranu z wyjątkiem, w którym jest login i hasło do bazy. 😉
W jaki sposób użyć filtrów?
Filtrów akcji możemy użyć na 3 poziomach:
- Pojedynczej akcji – konkretną akcję dekorujemy filtrem jako atrybut:
public class HomeController : Controller | |
{ | |
[HandleError] | |
public ActionResult Index() | |
{ | |
return View(); | |
} | |
} |
- Całego kontrolera – atrybutem dekorujemy cały kontroler:
[HandleError] | |
public class HomeController : Controller | |
{ | |
public ActionResult Index() | |
{ | |
return View(); | |
} | |
} |
- Całej aplikacji – w katalogu App_Start jest klasa FilterConfig, za pomocą której rejestrujemy filtr globalnie w całej aplikacji:
public class FilterConfig | |
{ | |
public static void RegisterGlobalFilters(GlobalFilterCollection filters) | |
{ | |
filters.Add(new HandleErrorAttribute()); | |
} | |
} |
W kolejnym artykule pokażę, w jaki sposób napisać własne filtry akcji ASP.NET MVC na przykładzie autoryzacji z wykorzystaniem logiki biznesowej.