Asp.net mvc 3 复杂类型上的可选[必需]

Asp.net mvc 3 复杂类型上的可选[必需],asp.net-mvc-3,data-annotations,Asp.net Mvc 3,Data Annotations,我正在尝试为表单设置viewmodel,该表单将收集有关加入团队的人员的信息。表格必须包含一些预备信息,然后是5名“团队成员”的列表(每个成员包含姓名、电子邮件和电话),其中前两名是必需的。对于我的验证,我希望它位于各个字段上,如下所示: Person 1: Name: (validation messaage) Email: (validation message) Phone: (validation message) Person 2: Name: (validation messaag

我正在尝试为表单设置viewmodel,该表单将收集有关加入团队的人员的信息。表格必须包含一些预备信息,然后是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: 
我的viewmodel的相关部分当前为:

[必需]
公共团队成员团队成员1{get;set;}
[必需]
公共团队成员团队成员2{get;set;}
公共团队成员团队成员3{get;set;}
公共团队成员团队成员4{get;set;}
公共团队成员团队成员5{get;set;}
所以在我看来,我只是写:

@Html.EditorFor(model=>model.TeamMember1)
@EditorFor(model=>model.TeamMember2)
@EditorFor(model=>model.TeamMember3)
@EditorFor(model=>model.TeamMember4)
@EditorFor(model=>model.TeamMember5)
编辑器模板如下所示:

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: 
@model MyProject.Models.TeamMember
@LabelFor(model=>model.Name)
@EditorFor(model=>model.Name)
@Html.ValidationMessageFor(model=>model.Name)
@LabelFor(model=>model.Email)
@EditorFor(model=>model.Email)
@Html.ValidationMessageFor(model=>model.Email)
@LabelFor(model=>model.Phone)
@EditorFor(model=>model.Phone)
@Html.ValidationMessageFor(model=>model.Phone)
很抱歉在一个线程中添加了这么多内容,但是对于如何最好地设置它,有人有什么建议吗?我考虑过从RequiredAttribute继承并替换TeamMember属性上的[Required],但我不确定如何在子字段上设置验证消息。现在,即使它是空的,也会通过所需的检查,我假设这是因为对象是绑定的(因此不是空的),即使所有属性都是空的


非常感谢您的反馈。

您可以编写自定义验证程序。下面是如何访问其他属性值的示例。然后,您可以使用此自定义项装饰团队成员或属性 验证属性,具体取决于验证逻辑。我会在班级层面上推荐它

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