2012-01-17 41 views
5

我试图让我的viewmodel设置为一个表单,它将收集有关加入团队的人的信息。表格必须包含一些leadup信息,然后列出5个“团队成员”(每个包含姓名,电子邮件和电话),其中前两个将是必需的。对于我的验证,我想它是在每个领域,像这样:可选复杂类型的[必需]

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: 

我的视图模型的相关部分现:

[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; } 
在我看来

所以,我只是写:

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

编辑模板看起来是这样的:

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

不好意思把这么多东西放到一个线程中,但是有人建议如何最好地设置它吗?我想过从RequiredAttribute继承并替换TeamMember属性上的[Required],但我不确定如何在子字段上设置验证消息。现在,即使它是空的,它也会通过必要的检查,我假设因为对象被绑定(并且不是空的),即使所有的属性都是空白的。

任何反馈意见。

回答

1

您可以编写自定义验证程序。以下是您如何访问其他属性值的示例。然后,您可以使用此自定义 验证属性修饰TeamMember或属性,具体取决于验证逻辑。我会在课堂上推荐它

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