2012-01-17 25 views
5

Próbuję ustawić mój wizualizer w formularzu, który będzie zbierał informacje o osobach dołączających do zespołu. Formularz musi zawierać niektóre informacje o przedłożeniu, a następnie listę 5 "członków zespołu" (każdy zawierający nazwisko, adres e-mail i telefon), z których pierwsze dwa będą wymagane. Dla mojego walidacji Chciałbym go być na poszczególnych dziedzin, takich jak to:Opcjonalne [Wymagane] w przypadku typów złożonych

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: 

Odpowiednia część mojego viewmodel jest obecnie:

[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; } 

więc moim zdaniem, po prostu napisać:

@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) 

szablon edytor wygląda tak:

@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> 

Przepraszamy za rzucanie tak wiele w jedną nitkę, ale czy ktoś ma sugestię, jak najlepiej to ustawić? Zastanawiam się nad dziedziczeniem z RequiredAttribute i zamianą [Required] na właściwości TeamMember, ale nie jestem pewien, jak ustawić komunikaty sprawdzania poprawności w polach potomnych. W tej chwili, nawet jeśli jest pusty, przechodzi wymaganą kontrolę, zakładam, że obiekty są powiązane (i nie są puste), mimo że wszystkie właściwości są puste.

Wszelkie uwagi są mile widziane.

Odpowiedz

1

Możesz napisać niestandardowy weryfikator. Poniżej znajduje się przykład, w jaki sposób można uzyskać dostęp do wartości innych właściwości. Następnie możesz udekorować TeamMember lub właściwość tym niestandardowym atrybutem walidacji w zależności od logiki sprawdzania poprawności. Polecam go na poziomie klasy

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"); 
} 
Powiązane problemy