Поскольку object value
параметр IsValid()
- это не вся модель, а только ваша string RetypePassword
.
Это должен быть атрибут, который влияет на весь объект модели, а не толькосвойство.
Хотя я бы предложил вам использовать PropertiesMustMatchAttribute
.
[PropertiesMustMatch("Password", "RetypePassword",
ErrorMessage = "The password and confirmation password do not match.")]
public class SignUpViewModel
{
[Required]
[StringLength(100)]
public string Username { get; set; }
[Required]
[Password]
public string Password { get; set; }
[Required]
[DisplayText("RetypePassword")]
public string RetypePassword { get; set; }
//...
}
Редактировать
Этот атрибут на самом деле не является частью ASP.NETИнфраструктура MVC2, но определенная в шаблоне проекта MVC 2 по умолчанию.
[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 );
}
}
В дополнение к этому, MVC 3 имеет CompareAttribute
, который выполняет именно то, что вам нужно.
public class SignUpViewModel
{
[Required]
[StringLength(100)]
public string Username { get; set; }
[Required]
[Password]
public string Password { get; set; }
[Required]
[DisplayText("RetypePassword")]
[Compare("Password")] // the RetypePassword property must match the Password field in order to be valid.
public string RetypePassword { get; set; }
// ...
}