如何为自定义View模型重用模型元数据?

时间:2010-10-19 12:03:59

标签: asp.net-mvc validation metadata dynamic-data data-annotations

我正在开发一个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'   包含以下未知数   属性或字段:密码。请确认   这些成员的名字是匹配的   上的属性名称   主要类型。

此外,即使没有发生此异常,我希望在表单提交上进行模型验证会遇到更多麻烦,因为在我的业务实体中将密码标记为必需。

我可以想到几个解决方法,但似乎没有一个是理想的。在任何情况下,我都无法更改数据库布局,以便密码字段在上面的示例中位于单独的实体中。

你会如何处理这种情况?

1 个答案:

答案 0 :(得分:0)

我能给你的唯一建议是拥有特定于每个视图的视图模型,并且在这些视图模型上只有必要的属性和验证属性。如果在视图模型上重复某些验证属性和属性,请不要担心。这就是他们的意思:反映给定观点的逻辑。