Action Filters - filtry akcji w ASP.NET MVC

Filtry akcji - zmiana wykonania akcji.


Action filters to atrybuty, które można przypisać do akcji kontrolera lub do całej klasy kontrolera (wszystkich akcji w kontrolerze), aby zmienić sposób wykonania akcji. Wszystkie filtry dziedziczą po interfejsach, dlatego możemy w łatwy sposób napisać swoje własne implementacje filtrów. Możemy również pisać własne filtry do innych metod, nie koniecznie tych z kontrolerów.

Główne typy Action Filters:

  • Filtry autoryzacji (Authorization filter) - implementują interfejs IAuthorizationFilter, zostają wywołane na samym początku przed metodą i wszystkimi innymi filtrami,
  • Filtry akcji (Action Filter) - implementują interfejs IActionFilter, który deklaruje 2 metody:
    • OnActionExecuting - metoda wywoływana przed rozpoczęciem danej akcji,
    • OnActionExecuted - metoda wywoływana po zakończeniu danej akcji.
  • Filtry rezultatu (Result Filter) - implementują interfejs IResultFilter, który deklaruje 2 metody:
    • OnResultExecuting - metoda wywoływana przed zwróceniem rezultatu,
    • OnResultExecuted - metoda wywoływana po zwróceniu rezultatu.
  • Filtry wyjątków (Exception Filter) - implementuje interfejs IExceptionFilter i zostaje wywołany, gdy wystąpi wyjątek.

Najważniejsze filtry zaimplementowane w MVC:

  • AuthorizeAttribute - atrybut wymagający autoryzacji, aby wywołać daną metodę:
    [Authorize]    
    public ActionResult Contact(int id)
    {
        ViewBag.Message = "Kontakt.";
    }
    
  • HandleErrorAttribute - określa, w jaki sposób mają być wyłapywane wyjątki:
    [HandleError]    
    public ActionResult Contact(int id)
    {
        ViewBag.Message = "Kontakt.";
    }
    
  • RequireHttpsAttribute - wymaga połączenia szyfrowanego HTTPS:
    [RequireHttps]
    public ActionResult Create()
    {
        return View();
    }
    
  • ValidateAntiForgeryTokenAttribute - sprawdza poprawność klucza, zabezpieczenie, które zostanie opisane w rozdziale o bezpieczeństwie:
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password,  
        persistCookie: model.RememberMe))
        {
            return RedirectToLocal(returnUrl);
        }
     
        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }
    
  • ValidateInputAttribute - wymusza walidacje danych wejściowych,
  • HttpGetAttribute - metoda będzie obsługiwać tylko żądania GET, domyślnie metoda obsługuje żądania GET, dlatego nie trzeba dodawać atrybutu [HttpGet],
  • HttpPostAttribute - metoda będzie obsługiwać tylko żądania POST:
    [HttpPost]
    public ActionResult ExternalLogin(string provider, string returnUrl)
    {
        return new ExternalLoginResult(provider, Url.Action("ExternalLoginCallback",
    new { ReturnUrl = returnUrl }));
    }
    
  • OutputCacheAttribute - metoda która będzie cachowana:
    [OutputCache(Duration = 10, VaryByParam = "none")]
    public ActionResult Index()
    {
        return View();
    }
    
Atrybuty umieszczamy w nawiasach kwadratowych []. Atrybut umieszczony przed metodą/akcją odnosi się tylko do danej akcji. Aby atrybut odnosił się do wszystkich akcji w kontrolerze należy umieścić atrybut przed klasą kontrolera.

Przykładowy kod:

[Authorize]
public class HomeController : Controller
{
    //ciało klasy i akcje kontrolera
}

Więcej informacji:

http://msdn.microsoft.com/en-us/library/system.web.mvc.filterattribute(v=vs.108).aspx
Komentarze facebook (polub nasz profil na FB aby je zobaczyć):