如何使用ASP.NET MVC 2验证两个属性

时间:2010-03-15 20:21:48

标签: asp.net-mvc validation asp.net-mvc-2 c#-3.0

我刚刚开始使用ASP.NET MVC 2,并且正在使用验证。

假设我有2个属性:

  • 密码1
  • 密码2

我想要求他们都被填写,并要求在模型有效之前两者都相同。

我有一个名为“NewUser”的简单类。

我该如何实现?我已经阅读了ValidationAttribute,并了解这一点。但我不知道如何使用它来实现一个验证,将两个或多个属性与eathother进行比较。

提前致谢!

以下解决方案的问题

当这应用于应用程序,并且ModelBinder运行模型的验证时, 是一个问题:

如果属性级ValidationAttribute 包含错误,则类级别ValidationAttribute NOT 验证。我还没有找到解决这个问题的方法。

如果您有解决此问题的方法,请分享您的经验。非常感谢!

1 个答案:

答案 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; }
}