2010-11-24 11 views
6

Me gustaría crear un atributo de filtro de acción personalizado que agregue un valor en los elementos de HttpContext a los que se podría acceder durante el enlace del modelo.ASP.NET MVC ActionFilterAttribute inject value before model binding

He intentado agregarlo en el OnActionExecuting pero parece que el enlace de modelo se ejecuta antes del filtro.

¿Tiene alguna idea de cómo podría hacerlo? Tal vez haya un método en el encuadernador que pueda anular que se activará después del filtro y use el valor inyectado por mi filtro.

Lo que yo quiero hacer, es inyectar un contexto de validación (la biblioteca que utilizo para la validación apoya contexto, es nvalid.net (www.nvalid.net)

Me gustaría ser capaz de colocar un atributo como

[ValidationContext("Prevalidation")] 

en mi método ActionResult, por lo que la validación que ocurre en mi carpeta modelo personalizado podía saber qué contexto va a utilizar al hacer la validación.

es por eso que no puedo simplemente hacer un archivador de modelo personalizado.

Respuesta

3

¿Por qué no simplemente escribir un encuadernador de modelo personalizado y trabajar en el método BindModel?

4

He encontrado la manera de lograrlo.

public class ModelBinder : DefaultModelBinder 
{ 
    protected override void OnModelUpdated(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var actionName = controllerContext.RouteData.Values["action"] != null 
           ? controllerContext.RouteData.Values["action"].ToString() 
           : string.Empty; 

     var attribute = controllerContext.Controller.GetType().GetMethods() 
      .Where(x => x.Name == actionName) 
      .Where(x => x.GetCustomAttributes(false).Any(a => a.GetType() == typeof(CustomActionFilterAttribute))) 
      .Select(x => x.GetCustomAttributes(typeof(CustomActionFilterAttribute), false).FirstOrDefault()) 
      .FirstOrDefault() as CustomActionFilterAttribute; 

     if(attribute != null && attribute.AnyProperty) 
     { 
      // Do what you want 
     } 
    } 
} 

Por la reflexión que puedo encontrar el atributo y usarlo en mi modelbinder

Cuestiones relacionadas