«Поле {0} обязательно для заполнения» - PullRequest
0 голосов
/ 10 октября 2018

В ASP.NET Core 2.0 я использую пользовательскую службу IStringLocalizer, и после настройки большая часть моего веб-сайта переводится, за исключением сообщения обязательного поля по умолчанию, даже после того, как я установил ModelBindingMessageProvider и DataAnnotationLocalizerProvider

Модель

public class EmailModel
{

    [Required]
    [EmailAddress()]
    public string Email { get; set; }
    [Required]
    [Display(Name = "Name")]
    public string Name { get; set; }
    [Required]
    [Phone]
    [Display(Name = "Phone")]
    public string Phone { get; set; }

    [Required]
    [Display(Name = "Subject")]
    public string Subject { get; set; }
    [Required]
    [Display(Name="Message")]
    public string Text { get; set; }
}

Startup.css (метод ConfigureServices)

  services
            .AddMvc(options =>
                {
                    var L = services.BuildServiceProvider().GetService<IStringLocalizer>();
                    options.ModelBindingMessageProvider.SetValueIsInvalidAccessor(
                        (x) => L["The value '{0}' is invalid."]);
                    options.ModelBindingMessageProvider.SetValueMustBeANumberAccessor(
                        (x) => L["The field {0} must be a number."]);
                    options.ModelBindingMessageProvider.SetMissingBindRequiredValueAccessor(
                        (x) => L["A value for the '{0}' property was not provided.", x]);
                    options.ModelBindingMessageProvider.SetAttemptedValueIsInvalidAccessor(
                        (x, y) => L["The value '{0}' is not valid for {1}.", x, y]);
                    options.ModelBindingMessageProvider.SetMissingKeyOrValueAccessor(
                        () => L["A value is required."]);
                    options.ModelBindingMessageProvider.SetUnknownValueIsInvalidAccessor(
                        (x) => L["The supplied value is invalid for {0}.", x]);
                    options.ModelBindingMessageProvider.SetValueMustNotBeNullAccessor(
                        (x) => L["Null value is invalid.", x]);
                })
            .AddViewLocalization()
            .AddJsonOptions(options => options.SerializerSettings.ContractResolver = new DefaultContractResolver())
              .AddDataAnnotationsLocalization(options => {
                  options.DataAnnotationLocalizerProvider = (type, factory) =>
                  {
                      return  services.BuildServiceProvider().GetService<IStringLocalizer>();
                  };
              })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.AddTransient<IStringLocalizer, Services.XMLStringLocalizerService>();

В моем файле локализации xml (мой сервися не использую файлы ресурсов) У меня есть следующие строки:

"Поле {0} не является допустимым номером телефона."- отлично работает

«Поле {0} обязательно» - не работает, потому что служба никогда не получает ни одного обязательного сообщения, которое выглядит следующим образом.

Так что любая идея о том, что ямне не хватает?

Я знал, что там мало таких идей, как 1) Установить ErrorMessage 2) Создать новый класс, который унаследовал класс RequiredArtibbute и установить сообщение по умолчанию в конструкторе класса

Но моя цель - изменить сообщение DEFAULT для RequierdAtrribute

1 Ответ

0 голосов
/ 11 октября 2018

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

, если вы сделали .AddDataAnnotationLocalization(...) в stratup, используйте его следующим образом:

[Required(ErrorMessage ="The field '{0}' is required")]
[Display(Name = "Name")]
public string Name { get; set; }

или, если вы не хотите использовать параметры запуска и укажите сообщение об ошибке от определенногообщий ресурс (при условии, что у вас есть файл ресурсов с именем «MyResources»):

[Required(
    ErrorMessageResourceName = nameof(MyResources.Required),
    ErrorMessageResourceType = typeof(MyResources))]
[Display(
    Name = nameof(MyResources.Name),
    ResourceType = typeof(MyResources))]
public string Name { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...