验证应用程序块和模型本地化

时间:2010-08-27 11:56:10

标签: .net validation localization validation-application-bl

我可以使用 ErrorMessageResourceName ErrorMessageResourceType 将规则转换为我的语言。但是如何翻译类名和属性呢?

目前,我将Valideringsmeddelandeför'LastName'作为验证消息。我希望 LastName 也能够进行本地化。

1 个答案:

答案 0 :(得分:2)

据我所知,验证应用程序块未使用ErrorMessageErrorMessageResourceNameErrorMessageResourceType属性。它们包含在验证应用程序块5.0中,因为VAB的BaseValidationAttribute现在继承自System.ComponentModel.DataAnnotations.ValidationAttribute。这些属性在DataAnnotations'ValidationAttribute中定义。通过继承DataAnnotations,应用程序和框架可以在不依赖于VAB的情况下验证模型(例如ASP.NET MVC所做的验证)。

您可以使用VAB的MessageTemplateResourceNameMessageTemplateResourceType,并且不使用任何标记并使用特定于该属性的文本。例如,将这个完整的文本放在您的资源中:“Valideringsmeddelandeförefternamn”(对不起,如果翻译很糟糕;我使用谷歌翻译)。

<小时/> 更新:

我在图书馆里做了一些挖掘,不幸的是,没有简单的办法解决这个问题。以下是位于GetMessage的{​​{1}}基类中定义的Validator方法的代码。

Microsoft.Practices.EnterpriseLibrary.Validation

如您所见,错误消息是使用protected internal virtual string GetMessage( object objectToValidate, string key) { return string.Format(CultureInfo.CurrentCulture, this.MessageTemplate, new object[] { objectToValidate, key, this.Tag }); } 格式字符串以及MessageTemplateobjectToValidatekey作为格式参数生成的。 Tag是您可以在Tag中定义的值,因此是静态的,不能是特定于文化的。验证属性时,提供的ValidationAttribute将始终是该属性的名称。该名称将由框架提供,通过反映经过验证的类型。

通过定义新的key并覆盖Validator,您可以使名称更加用户友好且语言更具特色。这样,您可以根据资源中的属性名称获取与文化相关的文本。但问题是,您必须为要使用的每个验证属性创建一个子类,并且对于每个验证属性,您必须继承支持的验证器类。虽然每个属性和每个验证器不应该包含那么多代码,但维护这样的代码库仍然会非常痛苦。

我认为简单地定义完整的消息会更容易,包括资源中用户友好,特定于语言的名称。

<小时/> 更新2:

我想到了一些可能有用的东西。当您的应用程序一次只能显示一种语言时,可能会有一种解决方法。如果显示的消息是基于线程的当前文化进行本地化的,那么这对Web应用程序不起作用,但如果您可以在应用程序的配置文件中配置语言特定的文本,它可能适用于桌面应用程序。

在应用程序的配置文件(VAB支持的模型)中定义验证规则时,可以将Tag属性与特定于语言的字符串一起使用。

GetMessage

仔细查看标记<validation> <type name="Company.Application.Domain.Person" defaultRuleset="Default" assemblyName="Company.Application.Domain"> <ruleset name="Default"> <properties> <property name="LastName"> <validator type="StringLengthValidator" tag="efternamn" upperBound="30" lowerBound="1" lowerBoundType="Inclusive" upperBoundType="Inclusive" negated="false" messageTemplate="" messageTemplateResourceName="" messageTemplateResourceType="" name="String Length Validator" /> </property> </properties> </ruleset> </type> </validation> 。当您将{2}占位符放在资源中的格式字符串中时,它将被标记中定义的字符串替换。换句话说,这个资源字符串:

tag="efternamn"

将导致此验证消息:

Valideringsmeddelande för '{2}'

当然,为了实现这一点,您的配置必须已本地化。这对于Web应用程序来说不是一个好的解决方案。

但是......你也可以更进一步,构建一个Valideringsmeddelande för 'efternamn' 实现,返回一个基于线程当前文化的IConfigurationSource实例。在这种情况下,您将必须在代码中构建配置。以下是如何执行此操作的示例:

ValidationSettings

您可以向public class MyConfigurationSource : IConfigurationSource { private Dictionary<CultureInfo, ValidationSettings> settings = new Dictionary<CultureInfo, ValidationSettings>(); public ConfigurationSection GetSection(string sectionName) { if (sectionName == ValidationSettings.SectionName) { var culture = CultureInfo.CurrentCulture; lock (this.settings) { if (!this.settings.ContainsKey(culture)) { this.settings[culture] = this.BuildSettingsFor(culture); } return this.settings[culture]; } } return null; } private ValidationSettings BuildSettingsFor( CultureInfo culture) { // TODO: Build up your configuration here. Example: new StringLengthValidatorData("LastName_Smaller100") { Tag = MyResources.GetValue( "Customer.LastName", culture), LowerBound = 1, LowerBoundType = RangeBoundaryType.Inclusive, UpperBound = 100, UpperBoundType = RangeBoundaryType.Inclusive } } } 提供MyConfigurationSource的实例,或者,如果您想要更好的集成,请在VAB配置中将此类型连接起来。

但是请注意,在代码中构建验证规则目前还有很多工作要做,特别是因为VAB还没有(还)有一个像样的流畅配置API(我抱怨这个here)。我正在编写一个API,使其更容易实现(请密切关注my blog)。

祝你好运。