Filtros
Los filtros de acción de ASP.NET Core permiten ejecutar código antes o después de una acción o de su resultado, de forma transversal: comprobar una condición, inyectar contenido en el HTML de respuesta, medir tiempos, etc. Un módulo puede aportar sus propios filtros y aplicarlos de forma global o acotada a ciertos controladores/acciones.
Tipos de filtro
Se usan las interfaces estándar de MVC:
IActionFilter/IAsyncActionFilter— antes y después de ejecutar la acción.IResultFilter/IAsyncResultFilter— antes y después de ejecutar el resultado (por ejemplo, para modificar una vista antes de que se envíe).IAuthorizationFilter,IExceptionFilter— autorización y manejo de excepciones.
public class MiResultadoFiltro : IResultFilter
{
public void OnResultExecuting(ResultExecutingContext context)
{
// Se ejecuta antes de renderizar el resultado.
// Útil, por ejemplo, para inyectar un widget en la respuesta HTML.
}
public void OnResultExecuted(ResultExecutedContext context) { }
}
Registrar filtros
Un módulo registra sus filtros desde su Iniciador, en ConfigurarServicios. La opción más sencilla es añadirlo a la lista global de filtros de MVC:
public override void ConfigurarServicios(IServiceCollection servicios, IAplicacionContexto appContexto)
{
servicios.Configure<MvcOptions>(o => o.Filters.Add<MiResultadoFiltro>());
}
El filtro se resuelve por DI, así que puede inyectar los servicios del módulo por constructor.
Acotar el filtro a controladores o acciones
Añadir un filtro a la lista global significa que se evalúa en cada solicitud, aunque solo actúe en unas pocas. Cuando el filtro solo aplica a un controlador o acción concretos hay dos alternativas más eficientes:
- Aplicarlo como atributo sobre el controlador o la acción con
[TypeFilter(typeof(MiResultadoFiltro))]o[ServiceFilter(typeof(MiResultadoFiltro))](este último cuando el filtro está registrado en el contenedor). Así solo se ejecuta donde está anotado. - Si el filtro debe ser global, hacerlo condicional: comprobar dentro del propio filtro el controlador/acción actual (o si la respuesta es una vista HTML) y salir temprano cuando no corresponda, para no penalizar el resto de solicitudes.
Prefiere acotar los filtros por atributo o por condición antes que dejarlos siempre activos en la lista global. Un filtro global que se ejecuta en cada petición para no hacer nada la mayoría de las veces es coste puro; resérvalo para lo que de verdad debe correr en todas partes.
Caso típico: inyectar contenido en la respuesta
Un uso frecuente de un IResultFilter en un módulo es añadir un widget o script a las páginas del núcleo sin modificarlas: el filtro detecta que la respuesta es una vista HTML e inserta el contenido en la zona correspondiente. En Crono, para inyectar interfaz en zonas de páginas existentes suele ser más directo el mecanismo de micro‑aplicaciones/zonas (ver Widgets); el filtro de resultado queda para casos en los que necesitas interceptar la tubería de MVC de forma más general.