vista ventajas validar net mvc modelo framework formulario ejemplos controlador asp asp.net-mvc-3 model-validation

ventajas - Validación del modelo/ASP.NET MVC 3-Atributo obligatorio condicional



validar formulario asp.net mvc (4)

Aquí hay una entrada del blog de MSDN sobre validaciones condicionales: http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx

Tengo problemas con mi aplicación ASP.NET MVC 3. Tengo 2 propiedades en mi modelo, por lo que solo quiero 1 de ellas en mi opinión según el que esté vacío. Entonces, por ejemplo, si ingreso un número de teléfono, entonces ya no se requiere el correo electrónico y viceversa, pero si los dejo vacíos, entonces se debe requerir 1, a continuación se muestra mi modelo:

[Display(Name = "Contact Phone Number:")] [MaxLength(150)] public string ContactPhoneNumber { get; set; } [Display(Name = "Contact Email Address:")] [MaxLength(100)] public string ContactEmailAddress { get; set; }

¿Tendría que crear un atributo personalizado para validar mi modelo y, de ser así, cómo lo lograría?


La validación condicional basada en anotaciones se puede definir usando ExpressiveAnnotations :

[RequiredIf("ContactPhoneNumber == null", ErrorMessage = "At least email or phone should be provided.")] public string ContactEmailAddress { get; set; } [RequiredIf("ContactEmailAddress == null", ErrorMessage = "At least email or phone should be provided.")] public string ContactPhoneNumber { get; set; }


Puede implementar IValidatableObject en su clase y proporcionar un método Validate() que implemente su lógica personalizada. Combine esto con la lógica de validación personalizada en el cliente si prefiere asegurarse de que se suministre uno. Encuentro esto más fácil que implementar un atributo.

public class ContactModel : IValidatableObject { ... public IEnumerable<ValidationResult> Validate( ValidationContext context ) { if (string.IsNullOrWhitespace( ContactPhoneNumber ) && string.IsNullOrWhitespace( ContactEmailAddress )) { yield return new ValidationResult( "Contact Phone Number or Email Address must be supplied.", new [] { "ContactPhoneNumber", "ContactEmailAddress" } ); } } }

Para que todo funcione en el lado del cliente, deberá agregar la siguiente secuencia de comandos a su vista:

<script type="text/javascript"> $(function() { $(''form'').validate(); $(''form'').rules(''add'', { "ContactPhoneNumber": { depends: function(el) { return !$(''#ContactEmailAddress'').val(); } } }); }); </script>


Sé que ya tienes una solución, pero tuve una situación similar, así que tal vez mi solución sea útil para otra persona. Implementé un atributo personalizado con validación del lado del cliente. Aquí está mi blog: http://hobbscene.com/2011/10/22/conditional-validation/