Cómo crear un filtro de acción personalizado en ASP.NET MVC
En ASP.NET MVC, los filtros se utilizan para inyectar lógica en diferentes niveles de procesamiento de solicitudes y nos permiten compartir lógicas entre controladores. Aprende más.
En ASP.NET MVC, los filtros se utilizan para inyectar lógica en diferentes niveles de procesamiento de solicitudes y nos permiten compartir lógicas entre controladores. Por ejemplo, supongamos que queremos ejecutar una lógica de seguridad o una lógica de registro en el controlador. Para ello, escribiremos un filtro que contenga esas lógicas y las habilitaremos en todos los controladores. Cuando habilitamos un filtro en todos los controladores o acciones, el filtro habilita la próxima solicitud HTTP.
Consideremos un escenario de registro: para cada solicitud entrante, necesitamos registrar algunos datos en los archivos sobre la base de alguna lógica. Si no creamos esta lógica dentro de un filtro personalizado, entonces tendremos que escribir lógica para la acción de cada controlador. Este mecanismo dará lugar a dos problemas:
- duplicación de código; y
- violación de los Principios de Responsabilidad Única; Las acciones ahora realizarán tareas adicionales de registro.
Podemos mitigar los problemas anteriores colocando la lógica de registro dentro de un filtro de acción personalizado y aplicando el filtro en todos los niveles de los controladores.
¿Alguna vez te has encontrado con un código fuente como el que se muestra en la imagen a continuación? [Authorize] es un filtro de autorización y se ejecuta antes de cualquier solicitud HTPP o ejecución de método de acción. El filtro Autorizar es parte de MVC, pero si es necesario, también podemos crear un filtro personalizado.
![[Authorize] is an Authorization filter, and it gets executed before any HTPP request or Action method execution. [Authorize] es un filtro de autorización y se ejecuta antes de cualquier solicitud HTPP o ejecución de método de acción.](/community/cfs-filesystemfile/__key/CommunityServer.Blogs.Components.WeblogFiles/dhananjay_5F00_kumar.filtermvc/2844.pic1.png)
En ASP.NET MVC, existen cuatro tipos de filtros:
- Filtro de autenticación
- Authorization Filter
- Filtro de acción
- Result Filter
- Filtro de excepciones
La secuencia de ejecución de varios filtros es la siguiente:
- El filtro de autenticación se ejecuta antes que cualquier otro filtro o método de acción
- El filtro de autorización se ejecuta después del filtro de autenticación y antes de cualquier otro filtro o método de acción
- El filtro Acción se ejecuta antes y después de cualquier método de acción
- El filtro de resultados se ejecuta antes y después de la ejecución de cualquier resultado de acción
- El filtro de excepciones solo se ejecuta si los métodos de acción, los filtros o los resultados de la acción producen una excepción
En un diagrama, podemos representar la secuencia de ejecución del filtro como se muestra a continuación:

Cada filtro tiene sus propios propósitos, sin embargo, la mayoría de las veces te encontrarás escribiendo un filtro de acción personalizado. Se ejecutan antes y después de la ejecución de una acción.
Custom Action Filter
Escribimos filtros de acción personalizados por varias razones. Es posible que tengamos un filtro de acción personalizado para el registro o para guardar datos en una base de datos antes de la ejecución de cualquier acción. También podríamos tener uno para obtener datos de la base de datos y establecerlos como los valores globales de la aplicación. Podemos crear filtros de acción personalizados por varias razones, que incluyen, entre otras:
- Creación de una autorización con privilegios
- Registro de la solicitud del usuario
- Preprocesamiento de la carga de imágenes
- Obtención de datos para mostrar en el menú de diseño
- Localización de la aplicación
- Lectura de la información del agente de usuario del navegador para realizar una tarea en particular
- Caching, etc.
Para crear un filtro de acción personalizado, debemos realizar las siguientes tareas:
- Create a class
- Inherit it from ActionFilterAttribute class
- Anule al menos uno de los siguientes métodos:
- OnActionExecuting: se llama a este método antes de que se ejecute una acción del controlador.
- OnActionExecuted: se llama a este método después de que se ejecute una acción del controlador.
- OnResultExecuting: se llama a este método antes de que se ejecute el resultado de una acción del controlador.
- OnResultExecuted: se llama a este método después de que se ejecute el resultado de una acción del controlador.
Vamos a crear un filtro de acción personalizado que realizará dos tareas, de la manera más simplista. Por supuesto, puede escribir código más sofisticado dentro del filtro de acción personalizado, pero vamos a crear un filtro personalizado con el nombre MyFirstCustomFilter, que realizará las siguientes dos tareas:
- Establezca algún valor de datos en ViewBag global.
- Registre la solicitud entrante en el método de acción del controlador.
El filtro se puede crear como se muestra en la lista a continuación:
using System;
using System.Diagnostics;
using System.Web.Mvc;
namespace WebApplication1
{
public class MyFirstCustomFilter : ActionFilterAttribute
{
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
//You may fetch data from database here
filterContext.Controller.ViewBag.GreetMesssage = "Hello Foo";
base.OnResultExecuting(filterContext);
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controllerName = filterContext.RouteData.Values["controller"];
var actionName = filterContext.RouteData.Values["action"];
var message = String.Format("{0} controller:{1} action:{2}", "onactionexecuting", controllerName, actionName);
Debug.WriteLine(message, "Action Filter Log");
base.OnActionExecuting(filterContext);
}
}
}
En la lista anterior, simplemente estamos configurando la propiedad ViewBag para los controladores que se están ejecutando. La propiedad ViewBag se establecerá antes de que se ejecute el resultado de una acción del controlador, ya que estamos invalidando el método OnResultExecutioning. Además, estamos invalidando OnActionExecuting para registrar la información sobre el método de acción del controlador.
Así que ahora hemos creado el filtro de acción personalizado. Ahora podemos aplicar eso en tres niveles posibles:
- Como filtro global
- A nivel de controlador
- A nivel de acción
Aplicación como filtro global
Podemos aplicar un filtro personalizado a nivel global agregando un filtro al filtro global en App_Start\FilterConfig. Una vez agregado a nivel global, el filtro estaría disponible para todos los controladores de la aplicación MVC.
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new MyFirstCustomFilter());
}
}
Filtrar a nivel de controlador
Para aplicar un filtro a nivel de controlador, podemos aplicarlo como un atributo a un controlador en particular. Cuando se aplica como nivel de controlador, la acción estaría disponible para todas las acciones del controlador en particular. Podemos aplicar MyFirstCustomFilter a HomeController como se muestra en la lista a continuación:
[MyFirstCustomFilter]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
Filtrar a nivel de acción
Finalmente, para aplicar un filtro en una acción en particular, podemos aplicarlo como un atributo de la acción como se muestra en la lista a continuación:
[MyFirstCustomFilter]
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
¡Y eso es todo para los filtros de acción personalizados! Espero que este post os sea útil, y gracias por leerme. ¿Tienes algo que añadir? ¡No dudes en dejar un comentario!