Я просто начинаю с ASP.NET MVC 2 и играю вокруг с Проверкой.
Скажем, у меня есть 2 свойства:
И я хочу потребовать, чтобы они были и заполнены и потребовали, чтобы оба были тем же, прежде чем модель будет действительна.
У меня есть простой класс под названием "NewUser".
Как я реализовал бы это? Я читал о ValidationAttribute и понимаю это. Но я не вижу, как я использовал бы это для реализации проверки, которая сравнивает два или больше свойства с eathother.
Заранее спасибо!
Проблема с ниже решения:
Когда это применяется к приложению, и ModelBinder выполняет проверку Модели, затем существует проблема:
Если уровень Свойства, ValidationAttribute содержит ошибку, то уровень Класса ValidationAttribute НЕ проверен. Я не нашел решение этой проблемы на данный момент.
Если у Вас есть решение этой проблемы, обменяйтесь своим опытом. Большое спасибо!
Стандартный шаблон 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; }
}