2012-01-17 19 views
5

Sto cercando di ottenere il mio viewmodel impostato per un modulo che raccoglierà informazioni sulle persone che si uniscono a un team. Il modulo deve contenere alcune informazioni di leadup, quindi un elenco di 5 "membri del team" (ognuno contenente un nome, e-mail e telefono), i primi due dei quali saranno richiesti. Per il mio convalida vorrei che fosse sui singoli campi, come questo:Facoltativo [Richiesto] per tipi complessi

Person 1: 
Name: (validation messaage) 
Email: (validation message) 
Phone: (validation message) 

Person 2: 
Name: (validation messaage) 
Email: (validation message) 
Phone: (validation message) 

Person 3: 
Name: 
Email: 
Phone: 

Person 4: 
Name: 
Email: 
Phone: 

Person 5: 
Name: 
Email: 
Phone: 

La quota di competenza del mio ViewModel è attualmente:

[Required] 
public TeamMember TeamMember1 { get; set; } 

[Required] 
public TeamMember TeamMember2 { get; set; } 

public TeamMember TeamMember3 { get; set; } 

public TeamMember TeamMember4 { get; set; } 

public TeamMember TeamMember5 { get; set; } 

in modo a mio avviso, ho solo scrivere:

@Html.EditorFor(model=>model.TeamMember1) 

@Html.EditorFor(model=>model.TeamMember2) 

@Html.EditorFor(model=>model.TeamMember3) 

@Html.EditorFor(model=>model.TeamMember4) 

@Html.EditorFor(model=>model.TeamMember5) 

Editor modello si presenta così:

@model MyProject.Models.TeamMember 

<div class="editor-label"> 
    @Html.LabelFor(model => model.Name) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Name) 
    @Html.ValidationMessageFor(model => model.Name) 
</div> 

<div class="editor-label"> 
    @Html.LabelFor(model => model.Email) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Email) 
    @Html.ValidationMessageFor(model => model.Email) 
</div> 

<div class="editor-label"> 
    @Html.LabelFor(model => model.Phone) 
</div> 
<div class="editor-field"> 
    @Html.EditorFor(model => model.Phone) 
    @Html.ValidationMessageFor(model => model.Phone) 
</div> 

Ci scusiamo per aver buttato così tanto in una discussione, ma qualcuno ha un suggerimento su come impostare al meglio questo? Ho pensato di ereditare da RequiredAttribute e di sostituire [Required] nelle proprietà TeamMember, ma non sono sicuro di come impostare i messaggi di convalida sui campi secondari. Al momento, anche se è vuoto, passa il controllo richiesto, sto assumendo perché gli oggetti sono vincolati (e quindi non null) anche se tutte le proprietà sono vuote.

Qualsiasi feedback è apprezzato.

risposta

1

È possibile scrivere un validatore personalizzato. Di seguito è riportato un esempio di come è possibile accedere ai valori di altre proprietà. È quindi possibile decorare TeamMember o la proprietà con questo attributo di convalida personalizzato in base alla logica di convalida. Lo consiglierei a livello di classe

protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
{ 
    //Retreive value of Name property 
    var nameProperty = validationContext.ObjectType.GetProperty("Name"); 
    var namePropertyValue = (string)nameProperty.GetValue(validationContext.ObjectInstance, null); 

    var propertyBeingValidatedValue = (string)value; 

    //Validation logic 
    if ((!string.IsNullOrEmpty(propertyBeingValidatedValue)) && (!string.IsNullOrEmpty(namePropertyValue))) 
    { 
     //returning null means everything is good. 
     return null; 
    } 
    //return a message in any other case. 
    return new ValidationResult("Validation Message"); 
} 
Problemi correlati