2012-01-17 28 views
5

Estoy tratando de configurar mi viewmodel para un formulario que recopilará información sobre las personas que se unen a un equipo. El formulario debe contener información inicial, luego una lista de 5 "Miembros del equipo" (cada uno con un nombre, correo electrónico y teléfono), de los cuales se necesitarán los dos primeros. Para mi la validación me gustaría que fuera de los campos individuales, así:Opcional [Obligatorio] en tipos complejos

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 parte pertinente de mi modelo de vista es actualmente:

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

por lo que en mi opinión, que acaba de escribir:

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

el editor de plantillas se ve así:

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

Disculpa por incluir tanto en un hilo, pero ¿alguien tiene alguna sugerencia sobre cómo configurarlo? He pensado en heredar de RequiredAttribute y reemplazar [Required] en las propiedades de TeamMember, pero no estoy seguro de cómo configurar los mensajes de validación en los campos secundarios. En este momento, incluso si está vacío, pasa la verificación requerida, estoy asumiendo porque los objetos están vinculados (y por lo tanto no son nulos) aunque todas las propiedades estén en blanco.

Se agradece cualquier comentario.

Respuesta

1

Puede escribir un validador personalizado. A continuación se muestra un ejemplo de cómo puede acceder a los valores de otras propiedades. A continuación, puede decorar TeamMember o la propiedad con este atributo de validación personalizado según la lógica de validación. Lo recomendaría en el nivel de la clase

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