Para ver el artículo en inglés, active la casilla Inglés. También puede ver el texto en inglés en una ventana emergente si pasa el puntero del mouse por el texto.
Traducción
Inglés

Filtrar en ASP.NET MVC

En ASP.NET MVC, los controladores definen métodos de acción que normalmente tienen una relación uno a uno con las posibles interacciones del usuario, como hacer clic en un vínculo o enviar un formulario. Por ejemplo, cuando el usuario hace clic en un vínculo, se enruta una solicitud al controlador designado y se llama al método de acción correspondiente.

A veces se desea ejecutar la lógica antes de llamar a un método de acción o después de ejecutar un método de acción. Para ello, ASP.NET MVC proporciona filtros. Los filtros son clases personalizadas que proporcionan un método declarativo y de programación para agregar el comportamiento previo y posterior a la acción a los métodos de acción del controlador.

Existe un proyecto de Visual Studio con código fuente para complementar este tema: Descargue.

ASP.NET MVC admite los siguientes tipos de filtros de acción:

  • Filtros de autorización. Implementan IAuthorizationFilter y toman decisiones de seguridad sobre si se debe ejecutar un método de acción, por ejemplo realizar la autenticación o validar las propiedades de la solicitud. La clase AuthorizeAttribute y la clase RequireHttpsAttribute son ejemplos de filtros de autorización. Los filtros de autorización se ejecutan antes que cualquier otro filtro.

  • Filtros de acción. Implementan IActionFilter y ajustan la ejecución del método de acción. La interfaz IActionFilter declara dos métodos: OnActionExecuting y OnActionExecuted. OnActionExecuting se ejecuta antes del método de acción. OnActionExecuted se ejecuta después del método de acción y puede llevar a cabo procesos adicionales, como proporcionar datos extra al método de acción, inspeccionar el valor devuelto o cancelar la ejecución del método de acción.

  • Filtros de resultados. Implementan IResultFilter y ajustan la ejecución del objeto ActionResult. IResultFilter declara dos métodos: OnResultExecuting y OnResultExecuted. OnResultExecuting se ejecuta antes de que se ejecute el objeto ActionResult. OnResultExecuted se ejecuta después del resultado y puede llevar a cabo procesos adicionales del resultado, como modificar la respuesta HTTP. La clase OutputCacheAttribute es un ejemplo de un filtro de resultado.

  • Filtros de excepciones. Implementan IExceptionFilter y se ejecutan si se produce una excepción no controlada durante la ejecución de la canalización de ASP.NET MVC. Los filtros de excepciones se pueden usar para tareas como registrar o mostrar una página de error. La clase HandleErrorAttribute es un ejemplo de filtro de excepción.

La clase Controller implementa cada una de las interfaces de filtro. Puede implementar cualquiera de los filtros de un controlador concreto invalidando el método On<Filter> del controlador. Por ejemplo, puede invalidar el método OnAuthorization. El controlador simple incluido en el ejemplo descargable invalida cada uno de los filtros y escribe información de diagnóstico cuando se ejecuta cada filtro. Puede implementar los siguientes métodos On<Filter> en un controlador:

ASP.NET MVC incluye los siguientes filtros, que se implementan como atributos. Los filtros se pueden aplicar en el método de acción, controlador o nivel de aplicación.

  • AuthorizeAttribute . Restringe el acceso mediante autenticación y opcionalmente mediante autorización.

  • HandleErrorAttribute . Especifica cómo controlar una excepción generada por un método de acción.

    NotaNota:

    Este filtro no detecta excepciones a menos que el elemento customErrors esté habilitado en el archivo Web.config.

  • OutputCacheAttribute . Proporciona almacenamiento en caché de resultados.

  • RequireHttpsAttribute . Obliga a reenviar las solicitudes HTTP no seguras sobre HTTPS.

Puede crear un filtro de las siguientes formas:

  • Invalide uno o más de los métodos On<Filter> del controlador.

  • Cree una clase de atributos que derive de ActionFilterAttribute y aplique el atributo a un controlador o un método de acción.

  • Registre un filtro con el proveedor de filtros (la clase FilterProviders).

  • Registre un filtro global mediante la clase GlobalFilterCollection.

Un filtro puede implementar la clase ActionFilterAttribute abstracta. Algunos filtros, como AuthorizeAttribute, implementan la clase FilterAttribute directamente. A los filtros de autorización siempre se les llama antes de ejecutar el método de acción y antes de todos los demás tipos de filtro. Otros filtros de acción, como OutputCacheAttribute, implementan la clase ActionFilterAttribute abstracta, que permite que el filtro de acción se ejecute antes o después de que se ejecute el método de acción.

Puede utilizar el atributo de filtro mediante declaración con métodos de acción o controladores. Si el atributo marca un controlador, el filtro de acción se aplica a todos los métodos de acción de ese controlador.

En el siguiente ejemplo se muestra la implementación predeterminada de la clase HomeController. En el ejemplo, se usa el atributo HandleError para marcar el controlador. Por consiguiente, el filtro se aplica a todos los métodos de acción del controlador.


[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }
}


Se pueden registrar varios proveedores de filtros. Los proveedores de filtros se registran utilizando la propiedad Providers estática. El método GetFilters(ControllerContext, ActionDescriptor) agrega los filtros de todos los proveedores en una lista única. Los proveedores se pueden registrar en cualquier orden; el orden en que se registran no tiene ningún efecto sobre el orden en que se ejecuta el filtro.

NotaNota:

Los proveedores de filtros son una nueva característica de ASP.NET MVC 3.

De forma predeterminada, ASP.NET MVC registra los siguientes proveedores de filtros:

El método GetFilters devuelve todas las instancias de IFilterProvider en el localizador de servicios.

Los filtros se ejecutan en el siguiente orden:

  1. Filtros de autorización

  2. Filtros de acción

  3. Filtros de la respuesta

  4. Filtros de excepciones

Por ejemplo, los filtros de autorización se ejecutan primero y los filtros de excepciones se ejecutan en último lugar. Dentro de cada tipo de filtro, el valor Order especifica el orden de ejecución. Dentro de cada tipo de filtro y orden, el valor de enumeración Scope especifica el orden de los filtros. Esta enumeración define los siguientes valores de ámbito de filtro (en el orden en el que se ejecutan):

  1. First

  2. Global

  3. Controller

  4. Action

  5. Last

Por ejemplo, un filtro de acción que tiene la propiedad Order establecida en cero y el ámbito de filtro establecido en First se ejecuta antes que un filtro de acción que tiene la propiedad Order establecida en cero y el ámbito de filtro establecido en Action.

El orden de ejecución de los filtros que tienen el mismo tipo, orden y ámbito es indefinido.

Los filtros OnActionExecuting(ActionExecutingContext), OnResultExecuting(ResultExecutingContext) y OnAuthorization(AuthorizationContext) se ejecutan en orden directo. Los filtros OnActionExecuted(ActionExecutedContext), OnResultExecuting(ResultExecutingContext) y OnException(ExceptionContext) se ejecutan en orden inverso.

NotaNota:

En ASP.NET MVC versión 3, el orden de ejecución de los filtros de excepciones ha cambiado para los filtros de excepciones que tienen el mismo valor Order. En ASP.NET MVC 2 y anteriores, los filtros de excepciones en el controlador con el mismo valor Order que los de un método de acción se ejecutaban antes que los filtros de excepciones en el método de acción. Normalmente esto ocurriría si los filtros de excepciones se aplican sin especificar un valor Order. En ASP.NET MVC 3, este orden se ha invertido para que el controlador de excepciones más específico se ejecute primero. Para obtener más información, vea la sección del orden de filtros más adelante en este documento.

Puede cancelar la ejecución del filtro en los métodos OnResultExecuting y OnActionExecuting estableciendo la propiedad Result en un valor no null. No se invocará ningún filtro OnActionExecuted ni OnActionExecuting pendiente y el invocador no llamará al método OnActionExecuted del filtro cancelado o de los filtros pendientes. Se ejecutará el filtro OnActionExecuted de los filtros ejecutados previamente. Se ejecutarán todos los filtros OnResultExecuted y OnResultExecuting.

Por ejemplo, imagine una aplicación de ASP.NET MVC que tiene un controlador Home y un controlador simple. Un filtro de control de tiempo de solicitudes global se aplica a la aplicación. El filtro de control de tiempo de solicitudes implementa los cuatro filtros de acción y de resultados (OnActionExecuting, OnActionExecuted, OnResultExecuting y OnResultExecuted). Cada método de filtro de la aplicación escribe información de seguimiento con el nombre del filtro, el nombre del controlador, el nombre de la acción y el tipo de filtro. En ese caso, el tipo de filtro es un filtro de control de tiempo de solicitudes. Una solicitud a la acción Index del controlador Home muestra el siguiente resultado en el agente de escucha de seguimiento (ventana de depuración).

Método de filtro

Controlador

Acción

Tipo de filtro

OnActionExecuting

Inicio

Índice

Filtro de control de tiempo de solicitudes

OnActionExecuted

Inicio

Índice

Filtro de control de tiempo de solicitudes

OnResultExecuting

Inicio

Índice

Filtro de control de tiempo de solicitudes

OnResultExecuted

Inicio

Índice

Filtro de control de tiempo de solicitudes

Considere la misma aplicación en la que un filtro de acción de seguimiento se aplica al controlador simple. El controlador simple también implementa los cuatro filtros de acción y de resultados. El controlador simple tiene tres filtros, cada uno de los cuales implementa los cuatro filtros de acción y de resultados. Una solicitud a la acción Details del controlador Simple muestra el siguiente resultado en el agente de escucha de seguimiento:

Método de filtro

Controlador

Acción

Tipo de filtro

OnActionExecuting

Sencillo

Detalles

Controlador simple

OnActionExecuting

Sencillo

Detalles

Acción de seguimiento

OnActionExecuting

Sencillo

Detalles

Control de tiempo de solicitudes

OnActionExecuted

Sencillo

Detalles

Control de tiempo de solicitudes

OnActionExecuted

Sencillo

Detalles

Acción de seguimiento

OnActionExecuted

Sencillo

Detalles

Controlador simple

OnResultExecuting

Sencillo

Detalles

Controlador simple

OnResultExecuting

Sencillo

Detalles

Acción de seguimiento

OnResultExecuting

Sencillo

Detalles

Control de tiempo de solicitudes

OnResultExecuted

Sencillo

Detalles

Control de tiempo de solicitudes

OnResultExecuted

Sencillo

Detalles

Acción de seguimiento

OnResultExecuted

Sencillo

Detalles

Controlador simple

Ahora considere la misma aplicación en la que el filtro de acción de seguimiento establece la propiedad Result en "Home/Index", como se muestra en el siguiente ejemplo:

if (filterContext.RouteData.Values.ContainsValue("Cancel")) {
    filterContext.Result = new RedirectResult("~/Home/Index");
    Trace.WriteLine(" Redirecting from Simple filter to /Home/Index");
}

La solicitud a la acción Details del controlador Simple con el resultado cancelado muestra el siguiente resultado en el agente de escucha de seguimiento:

Método de filtro

Controlador

Acción

Tipo de filtro

OnActionExecuting

Sencillo

Detalles

Controlador simple

OnActionExecuting

Sencillo

Detalles

Acción de seguimiento

OnActionExecuted

Sencillo

Detalles

Controlador simple

OnResultExecuting

Sencillo

Detalles

Controlador simple

OnResultExecuting

Sencillo

Detalles

Acción de seguimiento

OnResultExecuting

Sencillo

Detalles

Control de tiempo de solicitudes

OnResultExecuted

Sencillo

Detalles

Control de tiempo de solicitudes

OnResultExecuted

Sencillo

Detalles

Acción de seguimiento

OnResultExecuted

Sencillo

Detalles

Controlador simple

OnActionExecuting

Inicio

Índice

Filtro de control de tiempo de solicitudes

OnActionExecuted

Inicio

Índice

Filtro de control de tiempo de solicitudes

OnResultExecuting

Inicio

Índice

Filtro de control de tiempo de solicitudes

OnResultExecuted

Inicio

Índice

Filtro de control de tiempo de solicitudes

El ejemplo descargable de este tema implementa el filtrado descrito en estas tablas.

No almacene el estado del filtro en una instancia del filtro. El estado de cada solicitud normalmente se almacenaría en la propiedad Items. Esta colección se inicializa para que se vacíe con cada solicitud y se elimina cuando se completa la solicitud. El estado transitorio de cada usuario normalmente se almacena en la sesión del usuario. La información de estado del usuario a menudo se almacena en una base de datos. El ejemplo descargable de este tema incluye un filtro de control de tiempo que utiliza el estado de cada solicitud. Para obtener información sobre cómo crear filtros con estado, vea el vídeo Advanced MVC 3.

Título

Descripción

ASP.NET MVC 3 Service Location, Part 4: Filters

(Entrada de blog) Describe los filtros de ASP.NET MVC en un contexto de ubicación de servicio.

AuthorizeAttribute

Describe cómo usar el atributo Authorize para controlar el acceso a un método de acción.

OutputCacheAttribute

Describe cómo usar el atributo OutputCache para proporcionar almacenamiento en caché de resultados para un método de acción.

HandleErrorAttribute

Describe cómo usar el atributo HandleError para administrar excepciones producidas por un método de acción.

Crear filtros de acción personalizada

Describe cómo implementar los filtros de acción personalizados.

Cómo: Crear un filtro de acción personalizado

Explica cómo agregar un filtro de acción personalizado a una aplicación de ASP.NET MVC.

Adiciones de comunidad

AGREGAR
Mostrar: