【问题标题】:DataAnnotations and Resx in class library类库中的 DataAnnotations 和 Resx
【发布时间】:2011-06-18 17:25:16
【问题描述】:

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

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

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

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

    [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 小时内,对强类型资源包装器的要求已成为我存在的祸根。

我尝试对包装器进行通用化,但似乎验证属性专门寻找包装器上的一个属性,该属性名为 MyEntity_Name 用于 DisplayAttribute,MyEntity_Name_Required 用于RequiredAttribute。我还没有深入研究 DataAnnotations 代码,看看是否有一些魔法可以发挥作用。我希望其他人遇到这个并且有任何想法。

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

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

【问题讨论】:

  • 看起来只有 WebForms 视图中的编译时资源会从 .resx 中提取,构建操作为 Content,否则必须将它们标记为 Embedded Resource,DataAnnoations 才能使用它们。

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


【解决方案1】:

我错过了什么吗?

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

工作流程示例:

  1. 调用控制器操作并查询存储库以获取模型
  2. 控制器将模型映射到相应的视图模型(AutoMapper你可以在这里)
  3. 控制器将视图模型传递给视图,视图以正确的格式/本地化方式显示它。

结论:模型不应该被格式化/本地化,否则它们会变得更难以重用。

【讨论】:

  • 在我的团队中,我提出了将 ViewModel 移到表示层之外的担忧,从而总体上滥用了 MVC 框架。我的担忧通常(然而,愉快地)不屑一顾,因为我们希望保持验证集中。在表示层和下一层管理验证复杂性的正确方法是什么?我的看法是,这与我们需要 UI 验证并在下一层再次验证的 Web 表单没有什么不同。
  • @Jim,很难集中验证。这是一个示例:假设添加/更新视图。在Add 视图中,您没有Id 属性,您不需要关心它,因为您正在插入。在 Update 视图中,Id 属性是必需的,因为您正在修改现有实体。您看到您的验证规则如何根据视图发生变化?因此,我个人对视图模型执行所有简单的验证(格式化、必需、...)并对模型进行业务验证(用户名已被占用,...)。
  • 谢谢。这与我对验证的看法非常一致。我必须与团队中的其他人讨论,但很高兴知道我没有疯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-26
相关资源
最近更新 更多