2011-06-18 13 views
-1

私は実行中のアクションから反映された情報を取得する必要があるModelValidatorを実装しています。検証動作は、アクションの装飾方法によって変わります。その情報を入手できますか?ModelValidatorからアクション情報を取得

答えて

1

ModelValidatorのコンストラクタは、ControllerContextをとる必要があります。あなたのコントローラが飾られているものの属性を決定するために、そのオブジェクトを使用することができますので、のように:

context.Controller.GetType().GetCustomAttributes(typeof(YourAttribute), true).Length > 0 

編集:だから

attributes = context.Controller.GetType().GetCustomAttributes(true); 

:あなたはまた、そうのようなすべての属性のリストを取得することができます

特定の属性に基づいて検証するための簡単な例:

public class SampleValidator : ModelValidator { 
    private ControllerContext _context { get; set; } 

    public SampleValidator(ModelMetadata metadata, ControllerContext context, 
     string compareProperty, string errorMessage) : base(metadata, context) { 
     _controllerContext = context; 
    } 

    public override IEnumerable<ModelValidationResult> Validate(object container) { 
     if (_context.Controller.GetType().GetCustomAttributes(typeof(YourAttribute), true).Length > 0) { 
      // do some custom validation 
     } 

     if (_context.Controller.GetType().GetCustomAttributes(typeof(AnotherAttribute), true).Length > 0) { 
      // do something else 
     } 
    } 
} 

+0

私たちは、ほとんどがあります。私は、実行アクションが装飾されている属性を取得する必要があります。 – Eduardo

+0

編集された回答を参照してください。 – gram

+0

これはコントローラのすべての属性を返します。どちらの方法? – Eduardo

0

逆コンパイルSystem.Web.Mvc後、私はそれを得た:

protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes) 
{ 
    ReflectedControllerDescriptor controllerDescriptor = new ReflectedControllerDescriptor(context.Controller.GetType()); 
    ReflectedActionDescriptor actionDescriptor = (ReflectedActionDescriptor) controllerDescriptor.FindAction(context, context.RouteData.GetRequiredString("action")); 
    object[] actionAttributes = actionDescriptor.GetCustomAttributes(typeof(MyAttribute), true); 
} 
+0

Eduardo:モデレータレスポンスに関して、あなたの答えにあなたのブログエントリ全体を入れる必要はありません。ブログエントリの重要な情報を要約し、リンクを提供するだけです。裸のリンク(要約なし)の回答にはいくつかの問題があります。スパムのように見え、リンク腐敗に苦しんでいます。 –

関連する問題