私の知る限り、あなたの基準に合う方法はありません。できることがわかっていることの 1 つを実行する必要があります (最も適切な方法は、カスタム値プロバイダーだと思います)。
理由: デフォルトの ValueProvider はすべて、 または のいずれCultureInfo.InvariantCulture
かを使用するようにハードコードされていますCultureInfo.CurrentCulture
。
具体的には、次のようFormValueProvider
になります。
internal FormValueProvider(
ControllerContext controllerContext,
IUnvalidatedRequestValues unvalidatedValues
)
: base(
controllerContext.HttpContext.Request.Form,
unvalidatedValues.Form,
CultureInfo.CurrentCulture // <--- Grrr, argh
)
{
}
カルチャは他のどこからも取得されません (つまり、上記の引数はデフォルトとして使用されるのではなく、使用する 1 つのカルチャとして使用されます)。
さまざまな IValueProvider のカルチャ
参考までに、これらは既定の IValueProvider ごとのカルチャです。
- ChildActionValueProvider: InvariantCulture
- FormValueProvider: CurrentCulture
- JsonValueProvider: CurrentCulture
- RouteDataValueProvider: InvariantCulture
- QueryStringValueProvider: InvariantCulture
- HttpFileCollectionValueProvider: InvariantCulture
CurrentCulture
IValueProviderの置き換え
FormValueProvider
上記のように、基本クラスの ( ) コンストラクターを呼び出すだけなので、 を置き換えるのは大した作業ではありませんNameValueCollectionValueProvider
。これは、目的のカルチャを引数として受け取ります。
FormValueProvider の元の実装は、内部クラスとインターフェイスへの参照により、実際よりも難しいように見えます。ただし、プロバイダーを置き換えるために必要なわけではありません。単体テストのためにのみ存在します。
NameValueCollection
簡単に取得できる 2 つの と(静的メソッド)Request.Forms
のForms
プロパティを渡して、(前述のように) 基本コンストラクターを呼び出すだけで済みます。Validation.Unvalidated(Request)
そして、3 番目の引数を必要なカルチャに設定します。
はFormValueProviderFactory
さらに簡単です。
JsonValueProvider
はもう少し複雑です。基本的には、 のソースをJsonValueProviderFactory
新しいクラスにコピーして変更する必要があります。これは、 のオーバーライドは可能ですがGetValueProvider()
、そのメソッドは主に他のメソッドの呼び出しで構成されているprivate static
ためです。
編集 (Petar Ivanov):これでうまくいきました。それを機能させるには、カスタム ファクトリを に追加するだけでは十分ではありませんでしValueProviderFactories.Factories
たFormValueProviderFactory
。代わりにFormValueProviderFactory
、カスタムのものに交換する必要がありました。