2011-11-23 14 views
20

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. Así, por ejemplo, si entro en un número de teléfono a continuación, correo electrónico ya no es necesaria y viceversa, pero si dejo tanto vacía, entonces o bien 1 debe exigir, a continuación es mi modelo:Validación del modelo/ASP.NET MVC 3 - Atributo requerido condicional

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

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

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

Respuesta

23

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 conseguir que todo funcione en el lado del cliente tendrá que añadir la siguiente secuencia de comandos a la vista:

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

¿qué hay de validación del lado del cliente? – jgauffin

+2

Probablemente enganche en el complemento de validación de jQuery agregando una regla personalizada. '$ ('form'). validate(); $ ('form'). rules ('add', {"ContactPhoneNumber": {depends: function (el) {return! $ ('# ContactEmailAddress'). val();}}}); 'o similar – tvanfosson

+0

I He hurgado un poco, pero no he encontrado una manera fácil de crear un atributo que se enganche en el marco de validación automatizado del lado del cliente. Si está interesado, rastree cómo se maneja CompareAttribute y vea si puede ampliar el marco con algo similar. – tvanfosson

1

I 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 entrada en el blog: validación condicional basada en la anotación http://hobbscene.com/2011/10/22/conditional-validation/

15

se puede definir mediante 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; } 
Cuestiones relacionadas