2011-10-06 96 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); 
    } 
}