デフォルトのモデルバインダーは、小数点以下の数値フォーマットが異なる国(1.2 = 1,2など)でアプリケーションを使用している場合、double型のプロパティに対してエラーを返します。サイトのカルチャは、私のBaseControllerで条件付きで設定されます。
カスタムモデルバインダーを追加してbindModel関数をオーバーライドしようとしましたが、Cultureが既にデフォルトのen-GBに設定されているため、エラーを回避する方法がわかりません。
そこで、カルチャを設定するアクションフィルターをBaseControllerに追加しようとしましたが、残念ながら、bindModelはアクションフィルターの前に起動されるようです。
どうすればこれを回避できますか?カルチャをリセットしないようにするか、bindModelが起動する前に元に戻すか。
モデルが無効になるコントローラー:
public ActionResult Save(MyModel myModel)
{
if (ModelState.IsValid)
{
// Save my model
}
else
{
// Raise error
}
}
カルチャが設定されているフィルタ:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
CultureInfo culture = createCulture(filterContext);
if (culture != null)
{
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
}
base.OnActionExecuting(filterContext);
}
カスタムモデルバインダー:
public class InternationalDoubleModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (valueResult != null)
{
if (bindingContext.ModelType == typeof(double) || bindingContext.ModelType == typeof(Nullable<double>))
{
double doubleAttempt;
doubleAttempt = Convert.ToDouble(valueResult.AttemptedValue);
return doubleAttempt;
}
}
return null;
}
}