如何将DataAnnotations持久保存到ViewModel

时间:2011-05-05 19:04:27

标签: asp.net-mvc data-annotations

在我的应用程序中,我的模型结构用DataAnnotations修饰。这有助于我的验证完美,但是我不确定如何在没有双重输入的情况下将这些DataAnnotations保留到我的ViewModel。

基本上我很懒,而且我试图尽可能保持干燥。

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; }    
}

第一个类永远不会被View使用,但它包含应用程序所需的所有DataAnnotations。第二个类总是由CreateUser View使用,但我不想重新应用DataAnnotations。这可能吗?如果是这样,怎么样?

4 个答案:

答案 0 :(得分:5)

请参阅MetadataType属性,该属性允许您将DataAnnotations移动到单独的类中。

答案 1 :(得分:3)

在这种情况下,也许懒惰不是最好的

即使Todd provided a very nice approach使用元数据类型,我也不确定是否会将它们推荐为防弹解决方案。

<强>临

  • 确实您不必重复验证属性(特别是如果他们配置了本地化的错误消息=甚至更多的代码)

<强> N

  • 在模型实体本身并没有立即显示出正在验证的内容
  • 有时视图模型具有相同的属性名称,但它们的类型不同,因此验证逻辑不能轻易重用,并且您最终会在同一项目中使用混合验证方法,这可能会非常混乱

考虑模型实体的复杂性,尤其是关于具有某些其他实体的属性子集(在类型和名称方面)的百分比。

有时候你可能必须牺牲一些代码才能拥有更清晰,特别是高度可维护的代码。混合两者使得维护更加困难。

答案 2 :(得分:1)

尝试:

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; }    
}

我不推荐它,因为你添加耦合只是为了不能为视图模型添加验证。

答案 3 :(得分:0)

我不相信有一个简单的解决方案。您将不得不重复一点,并注释您的视图模型。如果您使用最新的实体框架是您的数据层,那么您可以使用带注释的实体类来利用数据验证。因此,即使您忘记注释视图模型,当它保存数据上下文时也会抛出验证异常。