类库中的DataAnnotations和Resx

时间:2011-01-31 16:53:26

标签: localization asp.net-mvc-3 data-annotations embedded-resource resx

对于我的应用程序(ASP.NET MVC 3.0 RTM,Razor View Engine),我想为我的模型使用DataAnnotations。如果我将模型类保留在Web项目中,我可以在App_GlobalResources或App_LocalResources中拥有resx资源,而无需将.resx嵌入到.resources文件中。

忽略新生成的AppDomain和其他注意事项,这是理想的,因为在本地化资源(如拼写错误或不正确的翻译)中更改次要内容不需要编译。

但是,在将模型移动到类库后,我没有看到任何方法将.resx文件保留为输出,仍然使用DataAnnotations属性。我错过了什么吗?

问题在于属性查找资源的方式。例如,“Name”属性可能如下所示:

    [Display(Name = "MyEntity_Name", ResourceType = typeof(Validations))]
    [Required(ErrorMessageResourceName="MyEntity_Name_Required", 
       ErrorMessageResourceType = typeof(Validations))]
    [StringLength(150, MinimumLength = 2)]
    public string Name { get; set; }

对强类型资源包装器的这一要求已经成为我过去24小时内存在的祸根。

我试图对包装器进行泛化,但似乎验证属性专门在DisplayAttribute上为名为MyEntity_Name的包装器查找属性,为RequiredAttribute查找MyEntity_Name_Required。我没有深入挖掘DataAnnotations代码,看看是否有一些魔法我可以完成。我希望别人遇到这个并有任何想法。

问题
是否可以在类库中使用DataAnnotations ValidationAttributes(包括DisplayAttribute)而无需将resx文件嵌入.resources个文件中?

陷阱:(
将来,我希望以极少的编码工作从resx迁移到数据库驱动的资源。由于资源有限(没有双关语意),我现在不能这样做。所以,我想避免绕过ResourceProvider。另外,我想避免重写或包装System.ComponentModel.DataAnnotations命名空间中的所有属性。

1 个答案:

答案 0 :(得分:3)

  

我错过了什么吗?

是的,您缺少View Models。控制器操作从视图中获取/传递视图模型,而不是模型。视图模型是专门针对给定视图的需求而定制的类。它们仅包含所需属性和给定视图的正确格式。视图模型可以是模型的子集或多个模型的聚合(它取决于视图的要求)。视图模型始终在Web项目中定义,因为它们与视图紧密耦合。因此,您应该使用资源对视图模型进行本地化/全球化。

工作流程示例:

  1. 调用控制器操作并查询存储库以获取模型
  2. 控制器将模型映射到相应的视图模型(AutoMapper可以在这里)
  3. 控制器将视图模型传递给视图,视图以适当的格式化/本地化显示它。
  4. 结论:模型不应该被格式化/本地化,或者它们变得更难以重用。