2010-03-15 7 views
6

Estoy empezando con ASP.NET MVC 2 y jugando con Validación.Cómo validar dos propiedades con ASP.NET MVC 2

Digamos que tengo 2 propiedades:

  • Password1
  • Contraseña2

y quiero requerir que ambos están llenos, y requieren que ambos son la misma antes de que el modelo es válida.

Tengo una clase simple llamada "NewUser".

¿Cómo implementaría eso? He leído sobre ValidationAttribute, y entiendo eso. Pero no veo cómo usaría eso para implementar una validación que compare dos o más propiedades contra eathother.

¡Gracias de antemano!

Problema con debajo solución:

Cuando esto se aplica a una aplicación, y la ModelBinder se ejecuta la validación del modelo, entonces no es un problema:

Si un Nivel de propiedad ValidationAttribute contiene un error, entonces Class-level ValidationAttribute es NOT validado. No he encontrado una solución a este problema hasta el momento.

Si tiene una solución a este problema, por favor comparta su experiencia. ¡Muchas gracias!

Respuesta

7

La plantilla predeterminada de ASP.NET MVC 2 de Visual Studio incluye el atributo de validación exacto que necesita. AccountModels.cs pegado de archivo:

[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); 
    } 
} 

Modo de empleo:

[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; } 
} 
+1

El único problema que veo con esto es, cuando dos propiedades del modelo (clase en este caso), no son iguales, no denota que las propiedades específicas contengan errores, como ocurre con [Obligatorio] y <% = Html.ValidationMessageFor (m => m.Password1)%> – CodeMonkey

+0

@CodeMonkey, ya veo. Aunque no estoy seguro de si hay una solución elegante para hacerlo funcionar de otra manera, utilizando el enlace de modelo. Después de todo, esto es técnicamente una validación de nivel de clase. Si ** debes ** agregar los errores a las propiedades, entonces tal vez verifique los dos valores en el controlador después de que el enlace sea la solución más rápida (aunque no la más elegante). –

+0

En la versión de MVC 2, el método de ayuda Html.ValidationSummary ahora puede mostrar los errores de solo modelo. – murki

Cuestiones relacionadas