validar net mvc formularios formulario form example campos asp asp.net-mvc validation asp.net-mvc-2 data-annotations asp.net-mvc-3

asp.net mvc - net - Los errores de validación a nivel de propiedad impiden la validación de la validación de nivel de clase



validar campos formulario mvc (3)

Actualización después de que se otorgó Bounty

Una nueva solución está llegando a este problema. Consulte ASP.NET MVC 3 Preview 1 aquí: http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx

Consulte en la sección Mejoras de validación del modelo , donde verá la solución a mi problema.

Publicación original

En referencia a mi publicación anterior Cómo validar dos propiedades con ASP.NET MVC 2 donde pregunté cómo podría comparar dos propiedades para la validación del modelo.

Encontré útil la respuesta, pero me quedé con un problema completamente diferente:

Problema : si un ValidationAttribute de nivel de propiedad contiene un error, entonces los ValidationAttributes de nivel de clase NO están validados.

Por favor considere lo siguiente:

[EqualTo("Email", "EmailConfirm", ErrorMessage = "E-mailadresserne skal være ens")] [EqualTo("Password", "PasswordConfirm", ErrorMessage = "Adgangskoderne skal være ens")] [Bind(Exclude="UserId")] public class EditSiteUser { [Required(ErrorMessage="Du skal bekræfte adgangskode")] public string PasswordConfirm { get; set; } [Required(ErrorMessage="Du skal bekræfte e-mailadressen")] [Email(ErrorMessage="Ugyldig e-mailadresse")] public string EmailConfirm { get; set; } public int UserId { get; set; } [Required(ErrorMessage = "Du skal indtaste et brugernavn")] public string Username { get; set; } [Required(ErrorMessage = "Du skal indtaste en adgangskode")] public string Password { get; set; } [Required(ErrorMessage = "Du skal indtaste en e-mailadresse")] [Email(ErrorMessage = "Ugyldig e-mailadresse")] public string Email { get; set; } }

Aquí tengo dos atributos de nivel de clase que validan EmailConfirm y PasswordConfirm.

Si un campo como Nombre de usuario está vacío y produce un error, entonces los dos Atributos EqualTo nunca se validan.

¿Alguien tiene una sugerencia para superar este problema?

EDITAR: Si necesita más información sobre este problema, por favor pregunte en los comentarios y estaré encantado de darle cualquier información adicional que necesite.

Preguntas:

P: "¿Por qué es importante que las verificaciones de nivel de clase se validen si falla una verificación de nivel de propiedad?".

R: "Porque esto es parte de un formulario, donde un usuario ingresa información en un formulario que se publica a través de AJAX. Cuando el formulario retorna, debe mostrar todos los problemas actuales".

P: "¿Qué es exactamente el atributo EqualTo que ha colocado en la clase? ¿Es un atributo de validación personalizado? De ser así, ¿cómo funciona? ¿Qué hace?"

A: EqualTo es un ValidationAttribute de nivel de clase que compara el valor de dos Propiedades de la clase-instancia. Busque "PropertiesMustMatchAttribute" para una implementación similar.


Esto no es compatible. Si cualquiera de las validaciones de nivel de propiedad falla, entonces las validaciones de nivel de clase no se realizan. Le sugiero que mire la Validación a prueba de MVC . Amplía la validación de MVC para agregar soporte para la validación de propiedad contingente. Creo que eso resolvería el problema en este caso particular.

El sitio del proyecto indica que no funciona con MVC2 RC, por lo que tendrá que descargar el código fuente y ponerlo en funcionamiento / adoptar sus ideas usted mismo.


A partir de su ejemplo, que le gustaría tener un cuadro de "confirmar otras entradas de cuadros de entrada", la implementación correcta sería

[EqualTo("Email", ErrorMessage = "E-mailadresserne skal være ens")] public string EmailConfirm { get; set; }

como el "error" es una validación del cuadro Confirmar. o en otras palabras, le gustaría tener el mensaje de error al lado del cuadro de confirmación, diciendo que no es el mismo que en el cuadro Correo electrónico.

esto devuelve la configuración de validación a la propiedad y soluciona el problema.


Para ampliar el enlace al artículo de Scott Guthrie , comenzando con MVC 3, puede realizar la validación de nivel de clase implementando la interfaz IValidatableObject .

Esto funcionará dentro del contexto de la canalización de validación actual para que pueda anidarse en tantas clases y propiedades personalizadas como desee y continuar devolviendo la matriz completa de posibles mensajes de error.

Para su clase, elimine los atributos de nivel de clase y agregue un método llamado Validate esta manera:

public class EditSiteUser : IValidatableObject { public int UserId { get; set; } [Required(ErrorMessage = "Du skal indtaste et brugernavn")] public string Username { get; set; } [Required(ErrorMessage = "Du skal indtaste en adgangskode")] public string Password { get; set; } [Required(ErrorMessage="Du skal bekræfte adgangskode")] public string PasswordConfirm { get; set; } [Required(ErrorMessage = "Du skal indtaste en e-mailadresse")] [Email(ErrorMessage = "Ugyldig e-mailadresse")] public string Email { get; set; } [Required(ErrorMessage="Du skal bekræfte e-mailadressen")] [Email(ErrorMessage="Ugyldig e-mailadresse")] public string EmailConfirm { get; set; } public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) { // put whatever class level validation you want here if (Email !== EmailConfirm) { yield return new ValidationResult("E-mailadresserne skal være ens", new[] {"EmailConfirm"}) } if (Password !== PasswordConfirm) { yield return new ValidationResult("Adgangskoderne skal være ens", new[] {"PasswordConfirm"}) } } }

Puede seguir yield return tantos mensajes de validación como desee.

Y puede mostrarlos todos en el cliente con @Html.ValidationSummary

Si desea que el mensaje aparezca junto a un control particular, el constructor ValidationResult toma una sobrecarga con los memberNames de las propiedades afectadas, y puede proporcionar el mensaje de validación para esa propiedad en particular con el helper ValidationMessageFor HTML como este:

@Html.ValidationMessageFor(Function(model) model.TestOne )

Además, vale la pena mencionar que puede usar CompareValidator para asegurarse fácilmente de que los valores de dos propiedades diferentes sean iguales. La ventaja de usar esta anotación es que automáticamente sabe cómo aplicar esto en el cliente y en el servidor, mientras que agregar IValidatableObject solo se ejecutará en el servidor.

[DataType(DataType.Password)] public string Password { get; set; } [Compare("Password")] [DataType(DataType.Password)] public string ConfirmPassword { get; set; }

Para leer más, Scott Guthrie otra publicación con más detalles sobre la validación de nivel de clase .