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



在我正在构建的社交网络应用程序中,我有一个非常复杂的用户配置文件系统。配置文件页面有选项卡,用于区分各类用户配置文件信息:基础、教育、工作。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来进行"服务器端"验证。然而,在上面的例子中,我们希望每个视图模型都"包含"自己的模型进行验证。

每个视图模型属性只能使用该视图模型中"包含"的数据注释。这是一种很好的方式,可以在你想要的地方"包容"你想要的东西。

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

最新更新