2010-11-24 2 views
6

Я хотел бы создать атрибут пользовательского атрибута действия, который добавит значение в элементы HttpContext, которые будут доступны во время привязки к модели.ASP.NET MVC ActionFilterAttribute значение инъекции перед привязкой модели

Я попытался добавить его в OnActionExecuting, но он кажется, что привязка модели вызывается перед фильтром.

Вы хоть представляете, как я мог это сделать? Может быть, есть метод в modelbinder, который я мог бы переопределить, который будет запущен после фильтра и использовать значение, введенное моим фильтром.

То, что я хочу сделать, это придать контекст проверки (библиотека я использую для проверки поддерживает контекст, это nvalid.net (www.nvalid.net)

Я хотел бы иметь возможность разместить атрибут, такой как

[ValidationContext("Prevalidation")] 

на моем методе ActionResult, так что проверка, что происходит в моей пользовательской модели вяжущего может знать, какой контекст использовать при выполнении проверки.

Вот почему я не могу просто сделать заказное модельное связующее.

ответ

3

Почему бы просто не написать обычное связующее устройство и работать в методе BindModel?

4

Я нашел способ его достижения.

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 
     } 
    } 
} 

По размышлении я могу найти атрибут и использовать его в моем ModelBinder

Смежные вопросы