2

我正在尝试在 Orchard 的管理页面中使用客户端验证。我已经成功地使用这个问题中讨论的技术使其工作,但是在对 Orchard 源代码和在线进行了一些挖掘之后,在我看来,注释掉这些行

// Register localized data annotations    
ModelValidatorProviders.Providers.Clear();
ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider());

正在颠覆一些允许本地化错误字符串的内置 Orchard 功能。在这一点上,将这些行包含在我们的之外OrchardStarter.cs是验证工作和不为我工作之间的唯一区别。

我希望得到一些关于这方面的指导,也许来自 Orchard 团队。如果这些行必须去掉才能进行验证,那么为什么它们首先存在呢?如果他们有充分的理由,那么我(和其他人)在尝试让客户端验证正常工作时做错了什么?如果需要,我很乐意发布代码示例,尽管它是一个带有数据注释的非常标准的 ViewModel。谢谢。

4

1 回答 1

2

这些行用于将DataAnnotationsModelValidatorProvider( DAMVP) 替换为 Orchard 自己的实现,这允许以 Orchard 方式本地化验证消息。它这样做的方式是[Required][LocalizedRequired]将控制权传递给DAMVP. 请注意,它DAMVP 确实可以完成它的工作 - 但只有在 Orchard 已经“弄乱”了这些属性之后。

问题是DAMVP使用类型Attribute来应用客户端验证属性。现在它找不到 eg RequiredAttribute,因为它已被LocalizedRequiredAttribute. 所以它不知道它应该添加什么——如果有的话——客户端验证属性。

因此,对这些行进行评论将使您失去 Orchard 的本地化。留下它们会使您失去客户验证。

一种可能有效的解决方法(没有通过 Orchard 的代码进行足够的查看,并且目前还没有测试的方法)是DAMVP了解 Orchard 的Localized属性以及如何处理它们。

DAMVP有一个静态RegisterAdapter()方法,用于为属性添加新的客户端规则。它需要使用属性的类型和客户端适配器(负责添加客户端属性的类)的类型。

因此,类似以下的内容可能会起作用:

在 OrchardStarter.cs 中:

// Leave the LocalizedModelValidatorProvider lines uncommented/intact

// These are the four attributes Orchard replaces. Register the standard
// client adapters for them:

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(LocalizedRegularExpressionAttribute), 
    typeof(RegularExpressionAttributeAdapter)
);

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(LocalizedRequiredAttribute), 
    typeof(RequiredAttributeAdapter)
);

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(LocalizedRangeAttribute), 
    typeof(RangeAttributeAdapter)
);

DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(LocalizedStringLengthAttribute), 
    typeof(StringLengthAttributeAdapter)
);

至于官方说法,自从 1.3 引入本地化验证以来,这似乎没有奏效,并且影响被认为是低的:http: //orchard.codeplex.com/workitem/18269

因此,目前,问题标题的官方答案似乎是“不应该”。

于 2013-08-10T17:28:10.703 回答