2011-11-23 8 views
20

Ho problemi con la mia applicazione ASP.NET MVC 3. Ho 2 proprietà nel mio modello per cui voglio solo 1 di esse richiesto nella mia vista in base a quale è vuoto. Così, per esempio, se entro un numero di telefono, allora e-mail non è più necessario e viceversa, ma se lascio entrambi vuoti, allora o dovrebbe essere richiesto 1, qui di seguito è il mio modello:Validazione modello/ASP.NET MVC 3 - Attributo richiesto condizionale

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

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

avrei bisogno di creare un attributo personalizzato per convalidare il mio modello e, in caso affermativo, come potrei ottenere questo risultato?

risposta

23

È possibile implementare IValidatableObject sulla classe e fornire un metodo Validate() che implementa la logica personalizzata. Combinalo con la logica di convalida personalizzata sul client se preferisci assicurarti che ne venga fornito uno. Trovo che questo sia più semplice dell'implementazione di un attributo.

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

per far funzionare tutto al lato client è necessario aggiungere la seguente script per la visualizzazione:

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

come sulla convalida lato client? – jgauffin

+2

Probabilmente collegarsi al plugin jQuery validate aggiungendo una regola personalizzata. . '$ ('Forma') validate(); $ ('form'). rules ('add', {"ContactPhoneNumber": {dipende da: function (el) {return! $ ('# ContactEmailAddress'). val();}}}); 'o simile – tvanfosson

+0

I Ho girato un po 'ma non ho trovato un modo semplice per creare un attributo che si agganci al framework di convalida automatizzato lato client. Se sei interessato, tieni traccia di come viene gestito CompareAttribute e vedi se puoi estendere il framework con qualcosa di simile. – tvanfosson

1

I so che hai già una soluzione, ma ho avuto una situazione simile, quindi forse la mia soluzione si rivelerà utile a qualcun altro. Ho implementato un attributo personalizzato con la convalida sul lato client. Ecco il mio post sul blog: convalida condizionale a base di annotazione http://hobbscene.com/2011/10/22/conditional-validation/

15

può essere definita utilizzando 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; }