Interceptando modelos desde los filtros de ASP MVC

Muchas veces he visto preguntas en los foros de internet, donde buscan una forma de obtener información de un modelo específico enviado como un parámetro hacia alguna acción desde los filtros.. y es de lo que hoy escribiré un poco.

Para no entrar tanto en detalle, solamente describiré que son los filtros y como se utilizan..

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, ahora su implementación es sencilla y se logra simplemente escribiendo el nombre del filtro en la sección declarativa de los ActionResults, por ej.

Mi controlador tendría un actionResult como este:

[NoCache]
public ActionResult Index()
{
   return Redirect("http://qbit.com.mx");
}

Y mi filtro NoCache el siguiente código:

public class NoCacheAttribute : ActionFilterAttribute
{
   public override void OnResultExecuting(ResultExecutingContext filterContext)
   {
       // ...
   }
 
   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
       // ...
   }
 
   // Por describir algunos métodos heredados de ActionFilterAttribute
}

Creo que eso está dominado, por lo que evitaré describir el tema, ahora para tomar un modelo (por ej. una clase de tipo modelo llamada UsuarioModel) que se pasó por la url o formulario hacia nuestro action, veamos el siguiente ejemplo:

[VerificarDatos]
public ActionResult Index(string param1, string param2, UsuarioModel user)
{
   return Redirect("http://qbit.com.mx");
}

Como pueden notar, ahora a index estoy enviando una serie de parámetros y uno de esos parámetros podría ser quizás un formulario (UsuarioModel) que al llegar al servidor se tomará como un objeto, la idea es tomar los parámetros de ese objeto y realizar alguna validación o lo que sea que necesiten, pero desde un filtro y eso lo hacemos desde el método OnActionExecuting que es el primer método que se ejecuta antes de ir al ActionResult.

public class VerificarDatosAttribute : ActionFilterAttribute
{
   private UsuarioModel _model = new UsuarioModel();
 
   public override void OnActionExecuting(ActionExecutingContext filterContext)
   {
       if ((filterContext.ActionParameters.ContainsKey("user")) && (filterContext.ActionParameters["model"] != null))
       {
           this._model = filterContext.ActionParameters["user"] as UsuarioModel;
       }
 
       base.OnActionExecuting(filterContext);
   }
}

Ahora, lo que ocurre aquí es que filterContext tiene acceso a todos los parámetros enviados al ActionResult y solamente basta con buscar la clave del parámetro para verificar si el parámetro fue enviado y no es nulo, luego hacer un cast hacia el tipo de dato original para ese parámetro. No estoy seguro, aunque creo que la verificación de si existe o no el parámetro user siempre la hará, pero la validación de si o no es nulo es la que realmente determina si el parámetro existe con alguna de sus propiedades.

Mmm.. espero no habler complicado más el tema, la verdad es que es realmente sencillo tomar los parámetros y revisarlos antes de permitir la continuidad del código hacia el ActionResult o hacer algo más, ojalá y haya quedado claro. :S

Happy Coding! 🙂

Co-fundador de Qbit Mexhico, usuario de linux, Developer en tecnologías web.. Nicaragüense, centro en basketball, primer centro en rugby y pintor los fines de semana. Ortögrafo y ambientalista psicológico (de escritorio).. ese soy yo!

Si te ha servido compártelo y difunde nuestro blog..

Facebook Twitter LinkedIn Google+ Flickr YouTube Skype 

Compartir en...Tweet about this on TwitterPin on Pinterest0Share on LinkedIn0Share on Google+0Share on Facebook0