2010-08-27 4 views
3

Привет всем, у меня есть собственный пользовательский атрибут проверки и назначить его для проверки уровня класса. К сожалению, он не называется. Я стараюсь изо всех сил думать, что это может решить проблему. Тем не менее, это занимает меня в течение нескольких часов, и я не могу найти, что атрибут не вызывается механизмом проверки.Пользовательский атрибут проверки не называется ASP.NET MVC

Для иллюстрации я приведу следующий код.

Атрибут

 
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true, Inherited = true)] 
    public sealed class BooleanDependencyAttribute : ValidationAttribute 
    { 
     private const string _defaultErrorMessage = "กรุณากรอก{0}"; 
     private readonly object _typeId = new object(); 

     public string DependencyPropertyName { get; private set; } 
     public string DependentPropertyName { get; private set; } 

     public BooleanDependencyAttribute(string dependencyPropertyName, string dependentPropertyName) 
      : base(_defaultErrorMessage) 
     { 
      DependencyPropertyName = dependencyPropertyName; 
      DependentPropertyName = dependentPropertyName; 
     } 



     public override object TypeId 
     { 
      get 
      { 
       return _typeId; 
      } 
     } 

     public override string FormatErrorMessage(string name) 
     { 
      return String.Format(CultureInfo.CurrentUICulture, ErrorMessageString,name); 
     } 

     public override bool IsValid(object value) 
     { 
      PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(value); 
      bool dependencyValue = (bool) properties.Find(DependencyPropertyName, true /* ignoreCase */).GetValue(value); 
      object dependentValue = properties.Find(DependentPropertyName, true /* ignoreCase */).GetValue(value); 
      if (dependencyValue) 
      { 
       return true; 
      } 
      else 
      { 
       if (dependentValue == null) 
       { 
        return false; 
       } 
       else 
       { 
        return true; 
       } 
      } 

     } 
    } 

ViewModel

 
    [BooleanDependency("ReleaseNow","ReleaseDate",ErrorMessage="Please enter release date")] 
    public class ContentCreate 
    { 

     public string Title { get; set; } 

     public DateTime? ReleaseDate { get; set; } 


     public string Details { get; set; } 

     public string Abstract { get; set; } 

     public string Tags { get; set; } 

     public bool ReleaseNow { get; set; } 

    } 

Пожалуйста, не могли бы вы помочь мне решить эту проблему.

ответ

4

Я нашел решение. Фактически валидация в уровне класса вызывается после того, как все проверки на уровне свойств действительны. Поэтому мне нужно выполнить другое требуемое свойство, тогда BooleanDependencyAttribute вызывается и действительное значение.

Спасибо за просмотр, отредактируйте название и ярлык.