2010-11-24 21 views
6

Ich möchte ein benutzerdefiniertes Aktionsfilterattribut erstellen, das einen Wert in den HttpContext-Elementen hinzufügt, auf die während der Modellbindung zugegriffen werden kann.ASP.NET MVC ActionFilterAttribute inject Wert vor Modellbindung

Ich habe versucht, es in der OnActionExecuting hinzuzufügen, aber es scheint, dass die Modelbinding vor dem Filter ausgeführt wird.

Haben Sie eine Idee, wie ich es tun könnte? Vielleicht gibt es eine Methode im Modelbinder, die ich überschreiben könnte, die nach dem Filter ausgelöst wird und den Wert verwendet, den mein Filter injiziert.

Was ich tun möchte, ist eine Validierung Kontext zu injizieren (die Bibliothek, die ich für die Validierung verwenden unterstützt Kontext, es nvalid.net ist (www.nvalid.net)

Ich mag wäre in der Lage sein, zu platzieren ein Attribut wie

[ValidationContext("Prevalidation")] 

auf meiner Action Methode, so dass die Validierung, die in meinem benutzerdefinierten Modell Binder auftritt könnte wissen, welcher Kontext zu verwenden, wenn die Validierung zu tun.

das ist, warum ich nicht einfach machen ein benutzerdefiniertes Modellbinder.

Antwort

3

Warum nicht einfach eine benutzerdefinierte Modellbinder schreiben und in der BindModel Methode arbeiten?

4

Ich habe einen Weg gefunden, es zu erreichen.

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

Durch Reflexion kann ich das Attribut finden und verwenden Sie es in meinem Modelbinder

Verwandte Themen