デフォルトのモデル バインダー (DefaultModelBinder) でローカライズがどこまで進んでいるかはわかりませんが、データのカルチャ固有の解析を処理できるバインダーを自分で簡単に作成できます。たとえば、新しいクラスを作成します。DoubleModelBinder と呼びましょう。以下をコピペします。
public class DoubleModelBinder : IModelBinder
{
/// <summary>
/// Binds the value to the model.
/// </summary>
/// <param name="controllerContext">The current controller context.</param>
/// <param name="bindingContext">The binding context.</param>
/// <returns>The new model.</returns>
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var culture = GetUserCulture(controllerContext);
string value = bindingContext.ValueProvider
.GetValue(bindingContext.ModelName)
.ConvertTo(typeof(string)) as string;
double result = 0;
double.TryParse(value, NumberStyles.Any, culture, out result);
return result;
}
/// <summary>
/// Gets the culture used for formatting, based on the user's input language.
/// </summary>
/// <param name="context">The controller context.</param>
/// <returns>An instance of <see cref="CultureInfo" />.</returns>
public CultureInfo GetUserCulture(ControllerContext context)
{
var request = context.HttpContext.Request;
if (request.UserLanguages == null || request.UserLanguages.Length == 0)
return CultureInfo.CurrentUICulture;
return new CultureInfo(request.UserLanguages[0]);
}
}
ここで行っているのは、独自の言語対応のダブル パーサーを確立することです。IModelBinder インターフェイスを実装するときは、BindModel メソッドを作成する必要があります。ここで処理が行われますが、何かを解析する前に、ブラウザーの言語に基づいて IFormatProvider を取得する必要があります。そのため、GetUserCulture メソッドを使用して、ブラウザーの言語を試して準備します。今の文化に戻らないと。
それができたら、値を解析できます。最初に ValueProvider (実際には Form コレクション、Request コレクションなどの多くの値プロバイダーの複合体) から取得し、次に、発見された IFormatProvider (現在持っている CultureInfo) を使用して解析します。
それが完了したら、それをモデル バインダー コレクションに追加するのは非常に簡単です。
ModelBinder.Binders[typeof(Double)] = new DoubleModelBinder();
それを試して、それが役立つかどうかを確認してください。