在我的应用程序中,我的模型结构用DataAnnotations装饰。这完美地帮助了我的验证,但是我不确定如何在没有双重输入的情况下让这些数据注释保存到我的 ViewModels 中。
基本上我很懒,我试图让它尽可能干燥。
class User
{
[Required]
public string FirstName {get; set; }
[Required]
public string LastName {get; set; }
public datetime RegistrationDate {get; }
}
class CreateUserViewModel
{
public string FirstName {get; set; }
public string LastName {get; set; }
}
第一个类永远不会被视图使用,但它包含应用程序所需的所有数据注释。第二个类总是由 CreateUser View 使用,但我不想重新应用 DataAnnotations。这可能吗?如果是这样,如何?
请参阅 MetadataType 属性,该属性允许您将 DataAnnotations 移动到单独的类中。
也许在这种情况下懒惰不是最好的
尽管 Todd 通过使用元数据类型提供了一种非常好的方法,但我不确定我是否会推荐它们作为防弹解决方案。
亲
- 确实,您不必重复验证属性(特别是如果他们配置本地化的错误消息 = 更多代码)
缺点:
- 在模型实体本身上,正在验证的内容并不明显
- 有时视图模型具有相同的属性名称,但它们的类型不同,因此验证逻辑不容易重用,并且您最终会在同一项目中使用混合验证方法,这可能会非常混乱
考虑模型实体的复杂性,尤其是具有其他实体属性子集(在类型和名称方面)的百分比。
也许有时你必须牺牲一些代码来获得更干净、特别易于维护的代码。将两者混合会使维护更加困难。
尝试:
interface IAmALazyUser
{
[Required]
string FirstName {get; set; }
[Required]
string LastName {get; set; }
}
class User : IAmALazyUser
{
public string FirstName {get; set; }
public string LastName {get; set; }
public datetime RegistrationDate {get; }
}
class CreateUserViewModel : IAmALazyUser
{
public string FirstName {get; set; }
public string LastName {get; set; }
}
不过,我不建议这样做,因为您添加耦合只是为了不向视图模型添加验证。
我不相信有一个简单的解决方案。您将不得不重复自己一点并注释您的视图模型。如果使用的是最新的实体框架作为数据层,则可以使用带批注的实体类利用数据验证。因此,即使您忘记注释视图模型,在保存数据上下文时也会引发验证异常。