ASP.NETコアモデルバインディングエラーメッセージのローカライズ
ASP.NET Coreを使用して、アプリケーションをローカライズしようとしています。 new asp .netコアリソースを使用してコントローラーとビューをローカライズし、oldリソースを使用してモデル検証用のエラーメッセージをローカライズすることができました。ただし、エラーメッセージがモデルフィールドアノテーション(「必須」など)にリンクされておらず、モデルバインディングのデータが正しくない場合(数値が必要なテキストなど)、次のようなエラーが表示されます。ローカライズできない:
「値 'abc'はIDに対して無効です。」
abc
のID
プロパティに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バージョンを対象としたものか、問題の解決に役立ちませんでした。
フレームワークモデルバインディングエラーメッセージをカスタマイズするには、 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モデルバインディングエラーメッセージをローカライズするには、次の手順を実行します。
リソースファイルの作成-ソリューションのResourcesフォルダーの下にリソースファイルを作成し、ファイルに名前を付けますModelBindingMessages.fa.resx。名前は任意ですが、ローカライザーを作成するために使用します。この例では、fa(ペルシャ語)カルチャを使用しました。
リソースキーの追加-リソースファイルを開き、エラーメッセージのローカライズに使用するキーと値を追加します。下の画像のようなキーと値を使用しました:
使用したキーは元のメッセージに似ていますが、
ValueMustNotBeNull
のキーはValueIsInvalid
と同じであったため、使用しましたNull値は無効です。 それのための。オプションの構成-
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."]);
_