Asp.Net MVC: Некоторое нелокализованное сообщение об ошибке по умолчанию?

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

На данный момент все идет хорошо, но я заметил проблему с некоторым сообщением об ошибке asp.net MVC.

У меня есть одно свойство в моей модели:

[Required]
[LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))]
public DateTime PublicationDate { get; set; }

LocalizedDisplayname - это расширение DisplayNameAttribute, которое входит в файл Resx, чтобы получить правильный перевод

Поток CurrentCulture и CurrentCultureUI находятся в fr-FR, поэтому сообщение должно отображаться на французском языке (например, с моим атрибутом [Required], автоматически отображать "Le champ Publication est requis".

Но в случае DateTime, если я ввожу то, что не является датой, валидатор возвращает мне только "The value 'asdfasdf' is not valid for Publication.", Итак:

  • Почему MVC иногда возвращает мне сообщение об ошибке на французском, а иногда и на английском, в том же виде (и я точно, это сообщение об ошибке по умолчанию)
  • Как заменить это сообщение в целом, указав текст типа "La valeur {0} n'est pas une date valide pour le champ {1}"

Большое спасибо

Ответ 1

Я думаю, что они отвечают на ваши два вопроса:

  • Почему MVC иногда возвращает мне сообщение об ошибке на французском, а иногда и на английском, в том же виде (и я точно, это сообщение об ошибке по умолчанию)

Одна заметная разница заключается в том, что атрибут [Required] выполняет явное подтверждение на стороне клиента, тогда как если ваше поле не содержит допустимого DateTime, вы получаете подтверждение на стороне сервера через сбой по умолчанию для связующего объекта для создания объекта DateTime из опубликованных данных формы. Это совсем другой механизм, который, я думаю, объясняет разные результаты. Было бы неплохо, если бы результат был последовательным, конечно.

  • Как заменить это сообщение в целом, указав текст типа "La valeur {0} n'est pas une date valide pour le champ {1}"

Существует два способа:

  • Скажите модели привязки по умолчанию, какую строку ресурсов использовать для сообщения об ошибке, используя свойство DefaultModelBinder.ResourceClassKey. См. Ответ на этот связанный вопрос для описания того, как этого достичь (для MVC 2, но он не изменился в MVC 3)
  • Хороший метод (я думаю) - это сделать проверку на стороне клиента. Это позволяет вам предоставить строку сообщения об ошибке из ваших локализованных ресурсов. Сделайте это, добавив атрибут DataType, как показано ниже, при условии, что вы создали класс ресурсов с именем MyLocalizedResources со строкой, имеющей ключ DateTimeFormatValidationMessage, переведенный на французский язык как "La valeur {0} n'est pas une date valide pour le champ {1}":

    [Required]
    [DataType(DataType.Date, ErrorMessageResourceType = typeof(MyLocalizedResources), ErrorMessageResourceName = "DateTimeFormatValidationMessage")]
    [LocalizedDisplayName("PublicationDate", NameResourceType = typeof(LocalizationResources.Views.Composer.BaseInfoForm))]
    public DateTime PublicationDate { get; set; }
    

Ответ 2

Структура ASP.NET MVC выполняет пару неявных проверок: требуется одна проверка, а другая - то, является ли значение действительным для свойства или не является валидацией, и это происходит, хотя мы не украшаем свойства данными -annotations.

Вам нужно создать ключи для PropertyValueInvalid и PropertyValueRequired в вашем глобальном классе ресурсов.

Этот поток поможет вам глобально локализовать проверку

Ответ 3

Вы можете локализовать свои пользовательские атрибуты проверки. Также вы локализуете встроенные атрибуты ASP.NET MVC.

Как и атрибут [Обязательный].

Пример:

[LocalizedRequired(ErrorMessage = "You must specify an email address")] 
string SomeProperty { get; set; }

И вы можете просто переопределить свойство Обязательное:

public class LocalizedRequiredAttribute: RequiredAttribute
{
    public override string FormatErrorMessage(string name)
    {
        return LocalizedString(ErrorMessage, name);
    }
}

Повторное использование в разных языках: Я думаю, что mvc получает код культуры текущего пользователя на стороне клиента.

Ответ 4

У меня была такая же проблема, такая же структура проекта. Я, наконец, использовал соглашения MVC, попробуйте этот путь.

Я заменил все аннотации данных [Required] на

[Обязательно (ErrorMessageResourceName = "Common_Mandatory_Field", ErrorMessageResourceType = typeof (MyExternalDllResources.Language))]

В строке ресурса "Common_Mandatory_Field" определяется таким образом, примеры: Итальянский файл ресурсов:: Il campo {0} è obbligatorio.

Английский ресурс: Поле {0} не требуется.

Файл ресурсов Японии:: {0} フ ィ ー ル ド が 必要 で す.

MVC заменит {0} на имя знака аннотации данных [Display] связанного элемента управления, переведенного, если в случае. Если вы не предоставите аннотацию [Display] данных, будет использовано определение свойства.