web-dev-qa-db-ja.com

ASP.NETコアモデルバインディングエラーメッセージのローカライズ

ASP.NET Coreを使用して、アプリケーションをローカライズしようとしています。 new asp .netコアリソースを使用してコントローラーとビューをローカライズし、oldリソースを使用してモデル検証用のエラーメッセージをローカライズすることができました。ただし、エラーメッセージがモデルフィールドアノテーション(「必須」など)にリンクされておらず、モデルバインディングのデータが正しくない場合(数値が必要なテキストなど)、次のようなエラーが表示されます。ローカライズできない:

「値 'abc'はIDに対して無効です。」

abcIDプロパティにViewを入力すると、フィールドへのモデルのバインドができず、フィールドの近くに検証メッセージが表示されるため、「値 'abc'はIDに対して無効です。」。私が使用しているクラスは次のとおりです。

public class Country : IHasID
{
    public int ID { get; set; }

    [Required(ErrorMessageResourceType = typeof(L.Val),
    ErrorMessageResourceName = "NameR")]
    [MaxLength(100, ErrorMessageResourceType = typeof(L.Val), 
    ErrorMessageResourceName = "Max")]
    public string Name { get; set; }

    /*Some other properties*/
}

インターネットで見つかった同様の問題は、古いasp .netバージョンを対象としたものか、問題の解決に役立ちませんでした。

18
Marko

フレームワークモデルバインディングエラーメッセージをカスタマイズするには、 ModelBindingMessageProvider のさまざまなエラーメッセージアクセサーにカスタムアクセサーを設定する必要があります。

ここでは、この投稿で説明されている内容の完全なソースコードをダウンロードできます。リポジトリには、ASP.NET Core 2.0(VS 2017.3)およびASP.NET Core 1.1(VS 2015)の例が含まれています。

また、ここでライブの例を見ることができます:

デフォルトのエラーメッセージ

これらは、プロパティへのモデルのバインドが失敗したときにフレームワークが表示するデフォルトのエラーメッセージです。

_MissingBindRequiredValueAccessor    A value for the '{0}' property was not provided.
MissingKeyOrValueAccessor           A value is required.
ValueMustNotBeNullAccessor          The value '{0}' is invalid. 
AttemptedValueIsInvalidAccessor     The value '{0}' is not valid for {1}.
UnknownValueIsInvalidAccessor       The supplied value is invalid for {0}.
ValueIsInvalidAccessor              The value '{0}' is invalid.
ValueMustBeANumberAccessor          The field {0} must be a number.
_

上記のメッセージに加えて、ASP.NET Core 2.0には次のメッセージもあります。

_MissingRequestBodyRequiredValueAccessor       A non-empty request body is required.
NonPropertyAttemptedValueIsInvalidAccessor    The value '{0}' is not valid.
NonPropertyUnknownValueIsInvalidAccessor      The supplied value is invalid.
NonPropertyValueMustBeANumberAccessor         The field must be a number.
_

ASP.NET Core Model Bindingエラーメッセージのローカライズ

ASP.NET Coreモデルバインディングエラーメッセージをローカライズするには、次の手順を実行します。

  1. リソースファイルの作成-ソリューションのResourcesフォルダーの下にリソースファイルを作成し、ファイルに名前を付けますModelBindingMessages.fa.resx。名前は任意ですが、ローカライザーを作成するために使用します。この例では、fa(ペルシャ語)カルチャを使用しました。

  2. リソースキーの追加-リソースファイルを開き、エラーメッセージのローカライズに使用するキーと値を追加します。下の画像のようなキーと値を使用しました:

    enter image description here

    使用したキーは元のメッセージに似ていますが、ValueMustNotBeNullのキーはValueIsInvalidと同じであったため、使用しましたNull値は無効です。 それのための。

  3. オプションの構成-ConfigureServicesメソッドで、Mvcを追加するときに、ModelBindingMessageProvider

    _public void ConfigureServices(IServiceCollection services)
    {
        services.AddLocalization(options => { options.ResourcesPath = "Resources"; });
        services.AddMvc(options =>
        {
            var F = services.BuildServiceProvider().GetService<IStringLocalizerFactory>();
            var L = F.Create("ModelBindingMessages", "AspNetCoreLocalizationSample");
            options.ModelBindingMessageProvider.ValueIsInvalidAccessor =
                (x) => L["The value '{0}' is invalid."];
            options.ModelBindingMessageProvider.ValueMustBeANumberAccessor =
                (x) => L["The field {0} must be a number."];
            options.ModelBindingMessageProvider.MissingBindRequiredValueAccessor =
                (x) => L["A value for the '{0}' property was not provided.", x];
            options.ModelBindingMessageProvider.AttemptedValueIsInvalidAccessor =
                (x, y) => L["The value '{0}' is not valid for {1}.", x, y];
            options.ModelBindingMessageProvider.MissingKeyOrValueAccessor =
                () => L["A value is required."];
            options.ModelBindingMessageProvider.UnknownValueIsInvalidAccessor =
                (x) => L["The supplied value is invalid for {0}.", x];
            options.ModelBindingMessageProvider.ValueMustNotBeNullAccessor =
                (x) => L["Null value is invalid.", x];
        })
        .AddDataAnnotationsLocalization()
        .AddViewLocalization();
        services.Configure<RequestLocalizationOptions>(options =>
        {
            var supportedCultures = new[]{new CultureInfo("en"), new CultureInfo("fa")};
            options.DefaultRequestCulture = new RequestCulture("en", "en");
            options.SupportedCultures = supportedCultures;
            options.SupportedUICultures = supportedCultures;
        });
    }
    _

    また、Configureメソッドの先頭に次のコードを追加します。

    _var supportedCultures = new[] { new CultureInfo("en"), new CultureInfo("fa") };
    app.UseRequestLocalization(new RequestLocalizationOptions()
    {
        DefaultRequestCulture = new RequestCulture(new CultureInfo("en")),
        SupportedCultures = supportedCultures,
        SupportedUICultures = supportedCultures
    });
    _

ASP.NET Core 2.0に関する重要な注意

ASP.NET Core 2.0では、モデルバインディングメッセージプロバイダーのプロパティは読み取り専用ですが、各プロパティのセッターメソッドが追加されました。

たとえば、ValueIsInvalidAccessorを設定するには、SetValueIsInvalidAccessor()メソッドを次のように使用する必要があります。

_options.ModelBindingMessageProvider.SetValueIsInvalidAccessor (
    (x) => L["The value '{0}' is invalid."]);
_
43
Reza Aghaei