对于我的应用程序(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命名空间中的所有属性。
答案 0 :(得分:3)
我错过了什么吗?
是的,您缺少View Models。控制器操作从视图中获取/传递视图模型,而不是模型。视图模型是专门针对给定视图的需求而定制的类。它们仅包含所需属性和给定视图的正确格式。视图模型可以是模型的子集或多个模型的聚合(它取决于视图的要求)。视图模型始终在Web项目中定义,因为它们与视图紧密耦合。因此,您应该使用资源对视图模型进行本地化/全球化。
工作流程示例:
结论:模型不应该被格式化/本地化,或者它们变得更难以重用。