2013-04-19 3 views
5

Sto utilizzando un tipo composito per un campo nel modello.Come applicare l'attributo richiesto su un modello composito?

Ho un campo nel mio modello di nome PersonDetails

public Phone PhoneDetails{get;set;} 

Phone è un altro modello che contiene altri tre campi come

int MobilePhone; 
int WorkPhone; 
int HomePhone; 

PersonDetails è un modello che sto passando per aggiungere popup. PersonDetails ha seguente campo:

public String Name{get;set;} 
public Phone PhoneDetails{get;set;} 
public string Address{get;set;} 

posso applicare Required attributo campo per campi rimanenti, ma voglio applicare attributo Required-PhoneDetails campo. La condizione è che almeno uno dei tre, cioè MobilePhone, WorkPhone o HomePhone, dovrebbe avere un valore.

Come posso risolvere questo problema?

+1

no, non è possibile applicare l'annotazione 'required' a oggetti complessi. Cioè, puoi ma la validazione non si applica. È possibile applicare l'annotazione 'required' a ciascun destinatario ... –

+0

@DaveA: Esiste un approccio che funzioni per questo accordo. –

+0

@DaveA: il messaggio di convalida del campo richiesto deve essere attivato se tutti e tre i campi sono vuoti. Ho provato a risolvere questo problema utilizzando anche la convalida personalizzata, ma non sono riuscito. Puoi per favore guidarmi riguardo a questo? –

risposta

2

Un approccio potrebbe essere quello di implementare IValidatableObject:

public class PersonDetails : IValidatableObject 
{ 
    public string Name { get; set; } 
    public Phone PhoneDetails { get; set; } 
    public string Address { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (PhoneDetails.MobilePhone == 0 && PhoneDetails.WorkPhone == 0 && PhoneDetails.HomePhone == 0) 
      yield return new ValidationResult("Please enter at least 1 phone number", new[] { "PhoneDetails" }); 
    } 
} 

Il modulo mostrerà "Si prega di inserire almeno 1 numero di telefono" se non vengono inseriti.

+0

Ho applicato le modifiche precedenti ma ha un problema. Fornisce un errore di runtime che mostra "Aggiungi il riferimento a ComponentModel.DataAnnotation" a tutte le posizioni in cui il modello PhoneDetails viene utilizzato in altri progetti. –

+0

Sì: sarà necessario fare riferimento a ComponentModel.DataAnnotations poiché credo che l'interfaccia si trovi in ​​quella libreria. È un problema? –

0

Per questo tipo di convalida utilizzo sempre FluentValidation.

Esso consente per gli scenari di convalida molto più complessi rispetto attributi/annotazioni ed è molto compatibile con MVC (e tutto il codice .NET in generale)

Usa NuGet per aggiungerlo al vostro progetto - un sacco di esempi e documentazione sono a disposizione.