Как проверить два свойства с ASP.NET MVC 2 - PullRequest
6 голосов
/ 15 марта 2010

Я только начинаю работу с ASP.NET MVC 2 и играю с проверкой.

Допустим, у меня есть 2 свойства:

  • Password1
  • password2

И я хочу требовать, чтобы они оба были заполнены, и требовать, чтобы оба они были одинаковыми до того, как модель станет действительной.

У меня есть простой класс с именем "NewUser".

Как бы я это реализовал? Я прочитал о ValidationAttribute и понимаю это. Но я не понимаю, как бы я использовал это для реализации проверки, которая сравнивает два или более свойства с другой.

Заранее спасибо!

Проблема с приведенным ниже решением :

Когда это применяется к приложению, и ModelBinder запускает проверку Модели, тогда - это проблема:

Если Атрибут ValidationAttribute уровня свойства содержит ошибку, то Атрибут ValidationAttribute уровня класса НЕ проверен. Я пока не нашел решения этой проблемы.

Если у вас есть решение этой проблемы, пожалуйста, поделитесь своим опытом. Большое спасибо!

1 Ответ

7 голосов
/ 16 марта 2010

Шаблон ASP.NET MVC 2 по умолчанию в Visual Studio включает в себя необходимый атрибут проверки. Вставлено из AccountModels.cs файла:

[AttributeUsage(AttributeTargets.Class, 
    AllowMultiple = true, Inherited = true)]
public sealed class PropertiesMustMatchAttribute : ValidationAttribute {
    private const string _defaultErrorMessage = 
        "'{0}' and '{1}' do not match.";
    private readonly object _typeId = new object();

    public PropertiesMustMatchAttribute(string originalProperty, 
        string confirmProperty)
        : base(_defaultErrorMessage) {
        OriginalProperty = originalProperty;
        ConfirmProperty = confirmProperty;
    }

    public string ConfirmProperty { get; private set; }
    public string OriginalProperty { get; private set; }

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

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

    public override bool IsValid(object value) {
        PropertyDescriptorCollection properties = 
           TypeDescriptor.GetProperties(value);
        object originalValue = properties.Find(OriginalProperty, 
            true /* ignoreCase */).GetValue(value);
        object confirmValue = properties.Find(ConfirmProperty, 
            true /* ignoreCase */).GetValue(value);
        return Object.Equals(originalValue, confirmValue);
    }
}

Как использовать:

[PropertiesMustMatch("Password", "ConfirmPassword", 
    ErrorMessage = "The password and confirmation password do not match.")]
class NewUser {
    [Required]
    [DataType(DataType.Password)]
    [DisplayName("Password")]
    public string Password { get; set; }
    [Required]
    [DataType(DataType.Password)]
    [DisplayName("Confirm password")]
    public string ConfirmPassword { get; set; }
}
...