我正在尝试创建一个用于编辑的视图模型,其中包含一些稍微不同的字段,然后是主模型,但是在尝试为此视图模型渲染视图时会出现它抛出和异常,因为缺少某些属性在MetadataType。
代码:
[MetadataType(typeof(IAdministrator))]
public partial class Administrator : IAdministrator
{
public string Name { get { return String.Format("{0} {1}", FirstName, LastName); } }
}
[MetadataType(typeof(IAdministrator))]
public class AdministratorEdit
{
public int AdministratorID { get; set; }
public string EmailAddress { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[DisplayName("New Password")]
[DataType(DataType.Password)]
[StringLength(12, MinimumLength = 8)]
public string NewPassword { get; set; }
[DisplayName("Re-New Password")]
[DataType(DataType.Password)]
[StringLength(12, MinimumLength = 8)]
public string ReNewPassword { get; set; }
}
public interface IAdministrator
{
[Required]
[DisplayName("Email Address")]
[DataType(DataType.EmailAddress)]
[RegularExpression(@"^(([\w-]+\.)+[\w-]+|([a-zA-Z]{1}|[\w-]{2,}))@((([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])\.([0-1]?[0-9]{1,2}|25[0-5]|2[0-4][0-9])){1}|([a-zA-Z]+[\w-]+\.)+[a-zA-Z]{2,4})$")]
[StringLength(320)]
string EmailAddress { get; set; }
[Required]
[DisplayName("Password")]
[DataType(DataType.Password)]
[StringLength(12, MinimumLength = 8)]
string Password { get; set; }
[Required]
[DisplayName("First Name")]
[DataType(DataType.Text)]
[StringLength(25)]
string FirstName { get; set; }
[Required]
[DisplayName("Last Name")]
[DataType(DataType.Text)]
[StringLength(25)]
string LastName { get; set; }
[DisplayName("Date Created")]
[DataType(DataType.Date)]
DateTime Date { get; set; }
}
这是我从使用AdministratorEdit模型的视图中获得的异常: 类型“.... Models.AdministratorEdit”的关联元数据类型包含以下未知属性或字段:密码,日期。请确保这些成员的名称与主要类型的属性名称相匹配。
有人可以提出另一种创建视图模型的方法,而不必指定另一个MetadataType或只是快速修复此异常吗?
答案 0 :(得分:3)
从IAdminstrator界面中,您可以提取基类(接口),基本界面只有编辑字段(IAdministratorEdit),IAdministrator将保留所有字段,因为它将从IAdministratorEdit继承。
public interface IAdministrator : IAdministratorEdit
然后只需在ViewModel上使用IAdministratorEdit接口。这样,您只需在元数据中定义约束一次。