9

デフォルトのモデルバインダーは、小数点以下の数値フォーマットが異なる国(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;
   }
}
4

2 に答える 2

3

アプリケーションで単一のカルチャを使用したいですよね?その場合は、web.configのグローバリゼーションタグを使用してこれを行うことができます。

<configuration>
    <system.web>
        <globalization
           enableClientBasedCulture="true"        
           culture="en-GB"
           uiCulture="en-GB"/>
    </system.web>
</configuration>

そして、それらのカスタムモデルバインダーを忘れて、デフォルトを使用することができます。

更新:わかりました、それは多言語アプリケーションです。どのようにしてあなたが望む文化を手に入れますか?MvcApplicationクラスでcreateCultureを呼び出すことができますか?あなたはこれを行うことができます:

public class MvcApplication : HttpApplication
{
    //...
    public void Application_OnBeginRequest(object sender, EventArgs e)
    {
        CultureInfo culture = GetCulture();
        Thread.CurrentThread.CurrentCulture = culture;
        Thread.CurrentThread.CurrentUICulture = culture;
    }
    //...
}

このメソッドはモデルバインドの前に呼び出されるため、カスタムモデルバインダーは必要ありません。私はそれがあなたのために働くことを願っています:)

于 2011-02-21T10:59:07.687 に答える
-1

この記事を見てください。ただし、要するに、これを試すことができれば:

public ActionResult Create(FormCollection values)
{
    Recipe recipe = new Recipe();
    recipe.Name = values["Name"];      

    // ...

    return View();
}

...またはこれ、モデルがある場合:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Recipe newRecipe)
{            
    // ...

    return View();
}

この記事には、完全な参照とこれを行う他の方法があります。私はこれらの2つを使用していますが、今までは十分でした。

于 2011-02-19T14:57:59.787 に答える