2014-01-13 5 views
0

Я не могу заставить атрибут compare работать, когда я проверяю объект вручную. Я сделал простое тестовое консольное приложение, которое также не работает. Я что-то не так?Сравнить атрибут DataAnnotations не работает

Я использую новейшую версию .Net Framework 4.5.1. Я сделал это консольное тестовое приложение, потому что оно также не работает в моем приложении MVC, которое выполняет dataannotations в бизнес-слое (отдельная библиотека классов).

Спасибо.

Тестируемый класс:

public class Change // : IValidatableObject 
{ 
    /// <summary> 
    /// The current password of this account. 
    /// </summary> 
    [Required(ErrorMessage = "Huidig wachtwoord is verplicht")] 
    [DataType(DataType.Password)] 
    public string CurrentPassword { get; set; } 

    /// <summary> 
    /// The new password for the logged in user account. 
    /// </summary> 
    [Required(ErrorMessage = "Wachtwoord is verplicht")] 
    [DataType(DataType.Password)] 
    public string NewPassword { get; set; } 

    /// <summary> 
    /// This must be the same as <see cref="NewPassword"/>. 
    /// </summary> 
    [Required(ErrorMessage = "Bevestig wachtwoord is verplicht")] 
    [Compare("NewPassword")] 
    [DataType(DataType.Password)] 
    public string NewPassword2 { get; set; } 

    //public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    //{ 
    // return new List<ValidationResult>(); 
    //} 
} 

Консоль приложения:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var change = new Change() 
     { 
      CurrentPassword = "ABC", 
      NewPassword = "123", 
      NewPassword2 = "12345678" 
     }; 

     Console.WriteLine("Initial values:"); 
     Console.WriteLine("NewPassword: " + change.NewPassword); 
     Console.WriteLine("NewPassword Confirm: " + change.NewPassword2); 
     Console.WriteLine(); 

     Console.WriteLine("Let's see if the compare attribute works..."); 
     Console.WriteLine("----------------------------------------------"); 
     Console.WriteLine(); 

     try 
     { 
      Validator.ValidateObject(change, new ValidationContext(change, null, null)); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      Console.ReadLine(); 

      throw ex; 
     } 

     Console.WriteLine("Validation doesn't work because you see this line."); 
     Console.ReadLine(); 
    } 
} 

Добавление IValidatableObject также не работает.

+0

Я нашел еще одну ошибку в атрибуте Compare, который в данный момент еще не выпущен с пакетами NuGet. https://aspnetwebstack.codeplex.com/workitem/1401 –

ответ

1

Попробуйте использовать другую перегрузку Validator.ValidateObject, которая принимает Boolean аргумент, чтобы проверить все свойства:

public static void ValidateObject(
    Object instance, 
    ValidationContext validationContext, 
    bool validateAllProperties 
) 

Ссылка: Validator.ValidateObject

Пример:

try 
{ 
    Validator.ValidateObject(change, new ValidationContext(change, null, null), true); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
    Console.ReadLine(); 

    throw ex; 
} 
+0

Можете ли вы сказать мне, что истинный делает? Почему требуемый атрибут работает без перегрузки с истинным, а сравнение нет? –

+0

О, я вижу в документации TryValidate в MSDN, что, если вы не используете истинную перегрузку, проверяются только необходимые атрибуты –

1

Попробуйте

private List<ValidationResult> ValidateModel(object model) 
     { 
      var validationResults = new List<ValidationResult>(); 
      var ctx = new ValidationContext(model, null, null); 
      Validator.TryValidateObject(model, ctx, validationResults, true); 
      return validationResults; 
     } 
+0

Извините, забыл перевод. Я отредактировал мой вопрос –

1

Calling Validator.ValidateObject (изменение, новый ValidationContext (change), true) работает для меня, логическое значение указывает валидатору на проверку всех свойств.

Смежные вопросы