Descripción de los filtros de acción (C#)

por Microsoft

Descargar PDF

El objetivo de este tutorial es explicar los filtros de acción. Un filtro de acción es un atributo que se puede aplicar a una acción del controlador (o a un controlador completo) que modifica la forma en que se ejecuta la acción.

Descripción de los filtros de acción

El objetivo de este tutorial es explicar los filtros de acción. Un filtro de acción es un atributo que se puede aplicar a una acción del controlador (o a un controlador completo) que modifica la forma en que se ejecuta la acción. El marco de ASP.NET MVC incluye varios filtros de acción:

  • OutputCache: este filtro de acción almacena en caché la salida de una acción del controlador durante un período de tiempo especificado.
  • HandleError: este filtro de acción controla los errores que se producen cuando se ejecuta una acción del controlador.
  • Autorizar: este filtro de acción le permite restringir el acceso a un usuario o rol determinado.

También puede crear sus propios filtros de acción personalizados. Por ejemplo, puede que quiera crear un filtro de acción personalizado para implementar un sistema de autenticación personalizado. O bien, es posible que desee crear un filtro de acción que modifique los datos de vista devueltos por una acción del controlador.

En este tutorial, aprenderá a crear un filtro de acción desde cero. Creamos un filtro de acción de registro que registra distintas fases del procesamiento de una acción en la ventana Salida de Visual Studio.

Incorporación de un filtro de acción

Un filtro de acción es un atributo. Puede aplicar la mayoría de los filtros de acción a una acción de controlador individual o a un controlador completo.

Por ejemplo, el controlador de datos de la lista 1 expone una acción denominada Index() que devuelve la hora actual. Esta acción está decorada con el filtro de acción OutputCache. Este filtro hace que el valor devuelto por la acción se almacene en caché durante 10 segundos.

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

Si invoca repetidamente la acción Index() escribiendo la dirección URL /Data/Index en la barra de direcciones del explorador y presionando el botón Actualizar varias veces, verá el mismo tiempo durante 10 segundos. La salida de la acción Index() se almacena en caché durante 10 segundos (vea la figura 1).

Cached time

Figura 01: Tiempo almacenado en caché (haga clic para ver la imagen de tamaño completo)

En la lista 1, se aplica un único filtro de acción, el filtro de acción OutputCache, al método Index(). Si lo necesita, puede aplicar varios filtros de acción a la misma acción. Por ejemplo, es posible que desee aplicar los filtros de acción OutputCache y HandleError a la misma acción.

En la lista 1, el filtro de acción OutputCache se aplica a la acción Index(). También puede aplicar este atributo a la propia clase DataController. En ese caso, el resultado devuelto por cualquier acción expuesta por el controlador se almacenaría en caché durante 10 segundos.

Los distintos tipos de filtros

El marco de ASP.NET MVC admite cuatro tipos diferentes de filtros:

  1. Filtros de autorización: implementa el atributo IAuthorizationFilter.
  2. Filtros de acción: implementa el atributo IActionFilter.
  3. Filtros de resultados: implementa el atributo IResultFilter.
  4. Filtros de excepción: implementa el atributo IExceptionFilter.

Los filtros se ejecutan en el orden descrito anteriormente. Por ejemplo, los filtros de autorización siempre se ejecutan antes de que los filtros de acción y los filtros de excepción siempre se ejecuten después de cada otro tipo de filtro.

Los filtros de autorización se usan para implementar la autenticación y la autorización para las acciones del controlador. Por ejemplo, el filtro Authorize es un ejemplo de filtro de autorización.

Los filtros de acción contienen lógica que se ejecuta antes y después de que se ejecute una acción del controlador. Puede usar un filtro de acciones, por ejemplo, para modificar los datos de vista que devuelve una acción del controlador.

Los filtros de resultados contienen lógica que se ejecuta antes y después de ejecutar un resultado de vista. Por ejemplo, puede que desee modificar un resultado de vista justo antes de que la vista se represente en el explorador.

Los filtros de excepción son el último tipo de filtro que se va a ejecutar. Puede usar un filtro de excepciones para controlar los errores generados por las acciones del controlador o los resultados de la acción del controlador. También puede usar filtros de excepciones para registrar errores.

Cada tipo de filtro diferente se ejecuta en un orden determinado. Si desea controlar el orden en el que se ejecutan los filtros del mismo tipo, puede establecer la propiedad Order de un filtro.

La clase base para todos los filtros de acción es la clase System.Web.Mvc.FilterAttribute. Si quiere implementar un tipo concreto de filtro, endrá que crear una clase que herede de la clase base Filter y que implemente una o más de las interfaces IAuthorizationFilter, IActionFilter, IResultFilter o IExceptionFilter.

Clase base ActionFilterAttribute

Para facilitar la implementación de un filtro de acción personalizado, el marco de ASP.NET MVC incluye una clase base ActionFilterAttribute. Esta clase implementa las interfaces IActionFilter y IResultFilter y hereda de la clase Filter.

La terminología aquí no es totalmente coherente. Técnicamente, una clase que hereda de la clase ActionFilterAttribute es un filtro de acción y un filtro de resultados. Sin embargo, en el sentido flexible, el filtro de acción de palabra se usa para hacer referencia a cualquier tipo de filtro en el marco de ASP.NET MVC.

La clase base ActionFilterAttribute tiene los métodos siguientes que puede invalidar:

  • OnActionExecuting: se llama a este método antes de ejecutar una acción del controlador.
  • OnActionExecuted: este método se llama después de ejecutar una acción del controlador.
  • OnResultExecuting: se llama a este método antes de ejecutar un resultado de acción del controlador.
  • OnResultExecuted: este método se llama después de ejecutar un resultado de acción del controlador.

En la sección siguiente, veremos cómo puede implementar cada uno de estos métodos diferentes.

Crear un filtro de acción de registro

Para ilustrar cómo puede crear un filtro de acción personalizado, crearemos un filtro de acción personalizado que registre las fases de procesamiento de una acción de controlador en la ventana Salida de Visual Studio. Nuestra LogActionFilter está contenida en la lista 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");
          }

     }
}

En la lista 2, los métodos OnActionExecuting(), OnActionExecuted(), OnResultExecuting()y OnResultExecuted() llaman al método Log(). El nombre del método y los datos de ruta actuales se pasan al método Log(). El método Log() escribe un mensaje en la ventana Salida de Visual Studio (vea la figura 2).

Writing to the Visual Studio Output window

Figura 02: Escribir en la ventana Salida de Visual Studio (haga clic para ver la imagende tamaño completo)

El controlador Home de la lista 3 muestra cómo puede aplicar el filtro de acción Log a toda una clase de controlador. Siempre que se invoque alguna de las acciones expuestas por el controlador Home, ya sea el método Index() o el método About(), las fases de procesamiento de la acción se registrarán en la ventana de Salida de 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();
          }
     }
}

Resumen

En este tutorial, se han presentado los filtros de acción de ASP.NET MVC. Ha aprendido sobre los cuatro tipos diferentes de filtros: filtros de autorización, filtros de acción, filtros de resultados y filtros de excepciones. También ha aprendido sobre la clase base ActionFilterAttribute.

Por último, ha aprendido a implementar un filtro de acción simple. Hemos creado un filtro de acción de registro que registra las fases de procesamiento de una acción de controlador en la ventana Salida de Visual Studio.