2010-11-24 13 views
6

モデルバインディング時にアクセス可能なHttpContext項目に値を追加するカスタムアクションフィルタ属性を作成したいとします。モデルバインディングの前にASP.NET MVC ActionFilterAttributeが値を注入します

これをOnActionExecutingに追加しようとしましたが、モデルバインディングがフィルタの前に出現しているようです。

どうすればいいですか?おそらく、モデルバインダには、フィルタの後に実行され、フィルタによって注入された値を使用するオーバーライド可能なメソッドがあります。私が配置できるようにしたいと思い

私が何をしたいのか、検証コンテキストを注入することである(私が検証に使用ライブラリは、コンテキストをサポートし、それはnvalid.net(www.nvalid.netです)

このように私のActionResult方式の

[ValidationContext("Prevalidation")] 

などの属性、私のカスタムモデルバインダーで発生する検証に検証を行うときに使用するコンテキストを知ることができるように。

私は単純に作ることができない理由ですカスタムモデルバインダー

答えて

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

でそれを使用することができます
関連する問題