重用ViewModels和数据注释

时间:2016-01-07 19:55:07

标签: c# asp.net-mvc asp.net-mvc-4

我对ASP MVC很陌生,所以当我第一次创建一个页面时,我创建了一个ViewModel,它具有与地址和联系人信息相关的扁平化属性。这些属性非常常见,我可以看到它们被重用。所以,让我们说我有以下的视图模型:

public class InformationViewModel {
    [Required(ErrorMessage = "Name is required")]
    public string Name { get; set; }
    public string Phone { get; set; }
    public string EMail { get; set; }
    public Uri WebSiteURL { get; set; }
    public Uri FacebookURL { get; set; }

    [HiddenInput(DisplayValue = false)]
    public string AddressId { get; set; }
    public string AttentionLine { get; set; }
    public string CareOf { get; set; }
    public string CountryCode { get; set; }
    public string CountryName { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public Dictionary<string, string> Countries { get; set; }
    public Dictionary<string, string> States { get; set; }
    public string StateCode { get; set; }
    public string StateName { get; set; }
    public string PostalCode { get; set; }

    //Some other properties specific to the view here
}

前两个属性块可在多个视图模型中重复使用。现在我正在开发一个需要这些相同属性的新页面。

1)我会将它们分成自己的View Model(或Model?)文件(例如AddressViewModel / ContactViewModel)吗?

1a)如果我将它们分开并重新使用它们,将它们作为InformationViewModel中的属性包含在行public AddressViewModel addressViewModel {get; set;}中?

2)如何在包含的视图模型中删除或应用数据注释(例如public AddressViewModel addressViewModel {get; set;}?例如,如果我希望某些视图需要名称,而其他视图则不需要。

1 个答案:

答案 0 :(得分:2)

查看模型特定于视图。因此,创建特定于视图的平面视图模型是个好主意。但是,如果您在多个视图模型中有一些共同属性,则可以根据需要从基础视图模型继承。

public class CreateUser
{
  [Required]
  public string Name {set;get;}
  [Required]
  public string Email {set;get;}

  public virtual string City { set; get; }
}
public class CreateUserWithAddress : CreateUser
{
  [Required]
  public string AddressLine1 {set;get;}
  public string AddressLine12 {set;get;}

  [Required]
  public override string City { set; get; }  // make city required
}

从基础视图模型继承时,您应该能够覆盖基类的属性并将数据注释添加到子类中的数据注释(就像我们对City属性)。但是,您无法删除派生类中基类中定义的数据注释。