4

我正在开发一个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; } 
} 

使用来自不同的看法元数据是没有问题的,只要我使用我的业务实体的ViewModels或为这样的视图模型的一部分:

//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

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

+1

这就是我到目前为止所做的,但它是很多重复的代码(以元数据属性的形式)。这也意味着必须为几个模型而不是仅仅一个模型单元测试验证属性,尽管本质上我只对所有模型具有相同的验证规则(例如,总是需要FirstName)。 – 2010-10-19 12:11:22

+0

只有在给定视图的给定上下文中,验证才有意义,因此为它编写单元测试应该不成问题。如果使用真实模型而不是视图模型,将会遇到的噩梦比将验证属性放在视图模型上要差几个数量级。你有没有考虑使用其他框架进行验证而不是数据注解? [FluentValidation](http://fluentvalidation.codeplex.com/)非常优秀,可以[单元测试](http://fluentvalidation.codeplex.com/wikipage?title=Testing&referringTitle=Documentation)。 – 2010-10-19 12:13:01

+0

这不是一个很大的问题,但是它有很多额外的工作,主要是额外的单元测试。这也意味着更高的bug,因为当我的业务模型上的验证规则发生变化时,我也必须更新几个视图模型规则。在这个过程中很容易忘记其中的一个。 – 2010-10-19 12:17:18

相关问题