我对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;}
?例如,如果我希望某些视图需要名称,而其他视图则不需要。
答案 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
属性)。但是,您无法删除派生类中基类中定义的数据注释。