【问题标题】:MVC3 localization for default validation errors默认验证错误的 MVC3 本地化
【发布时间】:2011-10-06 10:31:02
【问题描述】:

当我将 [Required] 属性放在 ViewModel 的属性上时,MVC3 会自动生成错误消息,例如: The Price field is required.

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

更新: 我知道,我可以通过指定[Required(ErrorMessage = "blablabla")] 来更改具体字段的错误消息,有没有办法可以在一个地方为所有[Required] 属性更改它,所以我可以只使用[Required] 而无需其他参数,它从一些资源/配置/等中获取了本地化错误消息?

【问题讨论】:

    标签: c# asp.net-mvc-3 localization data-annotations


    【解决方案1】:

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

    您需要做的就是下载我的代码并在您的 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/

    我将在完成视图本地化和替代 HTML 帮助程序后立即发布一个 nuget 包。

    【讨论】:

      【解决方案2】:

      Required 属性具有允许从资源字符串中读取消息的属性。详情见http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx

      【讨论】:

        【解决方案3】:

        为此,您应该已经有一些资源管理器,它可以返回字符串键的本地化文本。我的ResourceManager 对此有静态访问器(并在 Unity 中注册了 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);
            }
        }
        

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

          • 你安装框架语言包了吗? “您可能还需要通过“install-package jQuery.UI.i18n”在 NuGet 上为 DatePicker 和 jQuery UI 等内容提供本地化文件。请参见此处:hanselman.com/blog/…
          猜你喜欢
          • 1970-01-01
          • 2011-08-26
          • 1970-01-01
          • 2012-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-31
          • 1970-01-01
          相关资源
          最近更新 更多