我正在开发一个ASP.NET MVC 2项目,其中包含一些应用了元数据数据注释属性的业务实体(验证属性,显示属性等)。
类似的东西:
//User entity
public class User
{
[DisplayName("Vorname")]
[Required(ErrorMessage = "Vorname fehlt")]
[StringLength(MaxNameLength, ErrorMessage = "Vorname ist zu lang")]
public string FirstName { get; set; }
[DisplayName("Nachname")]
[Required(ErrorMessage = "Nachnamefehlt")]
[StringLength(MaxNameLength, ErrorMessage = "Nachname ist zu lang")]
public string LastName { get; set; }
[Required]
public string Password{ get; set; }
}
使用来自不同视图的元数据是没有问题的,只要我将我的业务实体用作视图模型或像这样的视图模型的一部分:
//custom viewmodel with a user entity
public class CustomViewModel
{
public User{get;set;}
//some more properties...
}
但是,有时我需要编写视图来编辑实体的某些字段,但不是所有字段。对于那些字段,我想重用已在我的用户实体中指定的元数据。其他字段应该被忽略。我在谈论像这样的自定义视图模型:
[MetadataType(typeof(User))]
public class UserNameViewModel
{
public string FirstName { get; set; }
public string LastName { get; set; }
//no password on purpose, the user should only
//edit his first and last name in this view
}
这就是我遇到问题的地方。上面的自定义视图模型在生成视图时会导致异常,因为它没有密码属性。
类型的关联元数据类型 'Zeiterfassung.Models.ViewModels.Users.UserNameViewModel +的usermodel' 包含以下未知数 属性或字段:密码。请确认 这些成员的名字是匹配的 上的属性名称 主要类型。
此外,即使没有发生此异常,我希望在表单提交上进行模型验证会遇到更多麻烦,因为在我的业务实体中将密码标记为必需。
我可以想到几个解决方法,但似乎没有一个是理想的。在任何情况下,我都无法更改数据库布局,以便密码字段在上面的示例中位于单独的实体中。
你会如何处理这种情况?
答案 0 :(得分:0)
我能给你的唯一建议是拥有特定于每个视图的视图模型,并且在这些视图模型上只有必要的属性和验证属性。如果在视图模型上重复某些验证属性和属性,请不要担心。这就是他们的意思:反映给定观点的逻辑。