我刚刚开始使用ASP.NET MVC 2,并且正在使用验证。
假设我有2个属性:
我想要求他们都被填写,并要求在模型有效之前两者都相同。
我有一个名为“NewUser”的简单类。
我该如何实现?我已经阅读了ValidationAttribute,并了解这一点。但我不知道如何使用它来实现一个验证,将两个或多个属性与eathother进行比较。
提前致谢!
以下解决方案的问题 :
当这应用于应用程序,并且ModelBinder运行模型的验证时, 是一个问题:
如果属性级ValidationAttribute 包含错误,则类级别ValidationAttribute 的 NOT 验证。我还没有找到解决这个问题的方法。
如果您有解决此问题的方法,请分享您的经验。非常感谢!
答案 0 :(得分:7)
Visual Studio的默认ASP.NET MVC 2模板包含您需要的确切验证属性。粘贴自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; }
}