2011-10-06 95 views
3

当我把我的视图模型的财产MVC3 [Required]属性自动生成类似的错误消息: The Price field is required.默认验证错误MVC3本地化

我的网站的单一语言是俄语,所以我想有本地化错误消息。我可以将字段名称本地化为[Display(Name = "blablabla")],但我如何本地化field is required部分?

更新: 我知道,我可以将它指定[Required(ErrorMessage = "blablabla")]更改错误信息的具体领域,是有办法,我可以改变它在一个地方所有[Required]属性,所以我可以只使用[Required]没有额外的参数,它从一些ressource/config/etc花了本地化的错误信息?

回答

2

我已经创建了一种替代解决方案,您不必使用属性进行本地化。我已经创建了自定义模型/验证元数据提供程序。

所有你需要做的就是下载我的代码,做你的Global.asax如下:

var stringProvider = new ResourceStringProvider(Resources.LocalizedStrings.ResourceManager); 
ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(stringProvider); 
ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider(stringProvider)); 

(该ResourceStringProvider是我的默认实现,但可以很容易地创建一个从XML文件中读取替代或数据库)

你可以阅读一下: http://blog.gauffin.org/2011/09/easy-model-and-validation-localization-in-asp-net-mvc3/

我会尽快发布一个NuGet包,因为我有我的观点本地化和我的人完定义HTML助手。

+0

感谢,会尝试看看 – Shaddix

-1

只需添加/更改全球化标签在web.config中:

<system.web> 
    <globalization uiCulture="your culture"/> 
+0

这不会对我的UICulture = “NL-NL” –

+0

做的工作你已经安装了框架语言包? “您可能还需要通过”install-package jQuery.UI.i18n“来获取NuGet上的DatePicker和jQuery UI等本地化文件。请参阅http://www.hanselman.com/blog/GlobalizationInternationalizationAndLocalizationInASPNETMVC3JavaScriptAndJQueryPart1.aspx – 10gler

1

授予这个你应该已经有了一定的资源管理器,可以返回本地化字符串键文本。我的ResourceManager具有静态访问器(并且注册了Unity for DI),所以不需要传递它。 在global.asax

ModelMetadataProviders.Current = new LocalizedModelMetadataProvider(); //field name localization 
ModelValidatorProviders.Providers.Clear(); 
ModelValidatorProviders.Providers.Add(new LocalizedModelValidatorProvider()); //validation message localization 

和实现是这样的:

public class LocalizedModelMetadataProvider : DataAnnotationsModelMetadataProvider 
{ 
    protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, 
                Func<object> modelAccessor, Type modelType, string propertyName) 
    { 

     var metadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName); 

     if (containerType == null || propertyName == null) 
      return metadata; 

     if (metadata.DisplayName == null) 
      metadata.DisplayName = ResourceManager.Current.GetLocalizedAttribute(containerType, propertyName); 

     if (metadata.Watermark == null) 
      metadata.Watermark = ResourceManager.Current.GetLocalizedAttribute(containerType, propertyName, "Watermark"); 

     if (metadata.Description == null) 
      metadata.Description = ResourceManager.Current.GetLocalizedAttribute(containerType, propertyName, "Description"); 

     if (metadata.NullDisplayText == null) 
      metadata.NullDisplayText = ResourceManager.Current.GetLocalizedAttribute(containerType, propertyName, "NullDisplayText"); 

     if (metadata.ShortDisplayName == null) 
      metadata.ShortDisplayName = ResourceManager.Current.GetLocalizedAttribute(containerType, propertyName, "ShortDisplayName"); 

     return metadata; 
    } 
} 

public class LocalizedModelValidatorProvider : DataAnnotationsModelValidatorProvider 
{ 
    protected override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context, IEnumerable<Attribute> attributes) 
    { 
     foreach (var attribute in attributes.OfType<ValidationAttribute>()) 
      attribute.ErrorMessage = ResourceManager.Current.GetValidationMessage(attribute); 

     return base.GetValidators(metadata, context, attributes); 
    } 
}