Локализация MVC3 для ошибок проверки по умолчанию - PullRequest
3 голосов
/ 06 октября 2011

Когда я ставлю атрибут [Required] в свойстве ViewModel, MVC3 автоматически генерирует сообщения об ошибках, такие как: The Price field is required.

Единственный язык моего сайта - русский, поэтому я хочу иметь локализованные сообщения об ошибках.Я могу локализовать имя поля с помощью [Display(Name = "blablabla")], но как я могу локализовать деталь field is required?

Обновление: я знаю, что могу изменить сообщение об ошибке для конкретного поля, указав его [Required(ErrorMessage = "blablabla")],есть ли способ изменить его в одном месте для всех атрибутов [Required], чтобы я мог использовать просто [Required] без дополнительных параметров, и он получил локализованное сообщение об ошибке из какого-то ресурса / config / etc?

Ответы [ 4 ]

2 голосов
/ 06 октября 2011

Я создал альтернативное решение, где вам не нужно использовать атрибуты для локализации. Я создал пользовательскую модель / провайдера метаданных проверки.

Все, что вам нужно сделать, это загрузить мой код и сделать следующее в вашем 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.

1 голос
/ 15 декабря 2014

Для этого у вас уже должен быть менеджер ресурсов, который может возвращать локализованные тексты для строковых ключей.У моего 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);
    }
}
1 голос
/ 06 октября 2011

Атрибут Required имеет свойства, которые позволяют читать сообщение из строки ресурса. Подробнее см. http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.requiredattribute.aspx

0 голосов
/ 17 апреля 2013

Просто добавьте / измените тег глобализации в web.config:

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