MVC3本地化用于默认验证错误

时间:2011-10-06 10:31:03

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

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

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

更新: 我知道,我可以通过指定[Required(ErrorMessage = "blablabla")]来更改具体字段的错误消息,有没有办法可以在一个地方为所有[Required]属性更改它,所以我只能使用{{1没有其他参数,它从一些ressource / config / etc?

获取了本地化的错误消息

4 个答案:

答案 0 :(得分: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/

一旦我完成了我的视图本地化和我的替代HTML帮助程序,我就会发布一个nuget包。

答案 1 :(得分:1)

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

答案 2 :(得分: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);
    }
}

答案 3 :(得分:-1)

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

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