ASP.NET MVC 5,如何在组成其他视图模型的视图模型上启用验证注释?

ASP.NET MVC 5, how to enable validation annotation on viewmodel that composes other view models?

好吧,我正在构建的社交网络应用程序中有一个非常复杂的用户配置文件系统。配置文件页面具有区分用户配置文件信息的每个类别的选项卡:基本、教育、工作。有一个 UserProfileViewModel 位于一切之上,它由 BasicViewModel、EducationViewModel 和 JobViewModel 等内部视图模型组成。考虑如下结构:

    public class ProfileViewModel
{
    public string id { get; set; }
    public BasicViewModel basic { get; set; }
    public EducationViewModel education { get; set; }
    public JobViewModel job { get; set; }
}

public class BasicViewModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime? DateOfRegistration { get; set; }
    public DateTime? DateOfBirth { get; set; }
    public string Gender { get; set; }
    public string PhoneNumber { get; set; }
    [Display(Name = "Biography")]
    public string Biography { get; set; }
    public string NickName { get; set; }
    public string FavoriteQuotes { get; set; }
}

public class EducationViewModel{
    public string EducationStatus { get; set; }
    public List<University> Universities { get; set; }
    public string CourseStatus { get; set; }
    public string CourseSpecialization { get; set; }
    public List<string> EducationEvents { get; set; }
}

public class JobViewModel
{
    public string WorkStatus { get; set; }
    public List<Company> Companies { get; set; }
}

public abstract class Organization
{
    public string Name { get; set; }
    public DateTime? Year { get; set; }
    public int TimePeiod { get; set; }
}

public class University: Organization
{
    public string Degree { get; set; }
    public string Profession { get; set; }
}

public class Company: Organization
{
    public string Website { get; set; }
    public string Position { get; set; }
}

所以问题是,用于模型验证(服务器端和客户端)的数据注释是否适用于具有这样的复合结构的模型?如果是这样,我是否像通常对简单视图模型所做的那样放置注释?如果没有,我怎样才能以其他方式实现这一目标?请帮忙。

任何单个视图模型都可能包含其他视图模型,如下所示:

此模型是服务器端:

[Serializable]
public class MyBigViewModel : IValidatableObject 
    {
       public MyBigViewModel(){
          MyOtherViewModel = new MyOtherViewModel();
          MyThirdViewModel = new MyThirdViewModel();
      }
      public MyOtherViewModel {get;set;}
      public MyThiddViewModel {get;set;} 

    public void Post(){
           //you can do something here based on post back 
           //like maybe this where the post method here processes new data
           MyOtherViewModel.Post();

    }

}

控制器可能如下所示:

  public ActionResult UserList (MyBigViewModel uvm){
      if(ModelState.IsValid){
         uvm.Post();
         return View(uvm);

      }
    return View(uvm);
  }

您可以实现 IValidateableObject 来进行 "server side" 验证。然而,在上面的示例中,我们希望每个视图模型 "contain" 它自己的模型用于验证。

每个视图模型 属性 只能在该视图模型中使用数据注释 "contained"。这是 "Contain" 随心所欲的好方法。

我经常在主 VM 中使用多个视图模型,并根据需要将它们与部分视图一起传递。