C# 默认验证错误的MVC3本地化

C# 默认验证错误的MVC3本地化,c#,asp.net-mvc-3,localization,data-annotations,C#,Asp.net Mvc 3,Localization,Data Annotations,当我将[Required]属性放在ViewModel的属性MVC3上时,会自动生成如下错误消息: 价格字段是必需的。 我的网站的单一语言是俄语,所以我想有本地化的错误消息。我可以使用[Display(name=“blablabla”)]本地化字段名称,但是如何本地化字段是必填的部分 更新: 我知道,我可以通过指定[Required(ErrorMessage=“blablabla”)]来更改具体字段的错误消息,是否有一种方法可以在一个地方更改所有[Required]属性的错误消息,这样我就可以只使

当我将
[Required]
属性放在ViewModel的属性MVC3上时,会自动生成如下错误消息:
价格字段是必需的。

我的网站的单一语言是俄语,所以我想有本地化的错误消息。我可以使用
[Display(name=“blablabla”)]
本地化字段名称,但是如何本地化
字段是必填的
部分

更新:
我知道,我可以通过指定
[Required(ErrorMessage=“blablabla”)]
来更改具体字段的错误消息,是否有一种方法可以在一个地方更改所有
[Required]
属性的错误消息,这样我就可以只使用
[Required]
,而无需其他参数,它从某个ressource/config/etc获取本地化错误消息。

所需属性具有允许从资源字符串读取消息的属性。有关详细信息,请参见

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

您只需下载我的代码,然后在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文件或数据库读取的替代方案很容易)

您可以在此处阅读:


我将在完成视图本地化和其他HTML帮助后立即发布nuget包。

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

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

为此,您应该已经有了一些资源管理器,可以为字符串键返回本地化文本。我的
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);
    }
}
公共类LocalizedModelMetadataProvider:DataAnnotationsModelMetadataProvider
{
受保护的重写ModelMetadata CreateMatadata(IEnumerable属性,类型containerType,
Func modelAccessor,类型modelType,字符串propertyName)
{
var metadata=base.CreateMetadata(属性、containerType、modelAccessor、modelType、propertyName);
if(containerType==null | | propertyName==null)
返回元数据;
如果(metadata.DisplayName==null)
metadata.DisplayName=ResourceManager.Current.GetLocalizedAttribute(containerType,propertyName);
如果(metadata.Watermark==null)
metadata.Watermark=ResourceManager.Current.GetLocalizedAttribute(containerType,propertyName,“水印”);
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”);
返回元数据;
}
}
公共类LocalizedModelValidator提供程序:DataAnnotationsModelValidatorProvider
{
受保护的重写IEnumerable GetValidator(ModelMetadata元数据、ControllerContext上下文、IEnumerable属性)
{
foreach(attributes.OfType()中的var属性)
attribute.ErrorMessage=ResourceManager.Current.GetValidationMessage(属性);
返回base.GetValidators(元数据、上下文、属性);
}
}

您是否安装了框架语言包?您可能还希望通过“install package jQuery.UI.i18n”获得NuGet上的DatePicker和jQuery UI等本地化文件。请参见此处: