2011-06-18 54 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:關於您的主持人迴應,您不必將整個博客條目放入您的答案中。只是總結您的博客條目的重要細節,並提供一個鏈接。裸鏈接(沒有摘要)的答案有幾個問題;他們看起來像垃圾郵件,他們遭受鏈接腐爛。 –