22

ASP.NET MVC のモデル バインドは優れていますが、ロケール設定に従います。私のロケールでは小数点区切り記号はコンマ (',') ですが、ユーザーはドット ('.') も使用します。これは、レイアウトの切り替えが面倒なためです。decimalモデルのすべてのフィールドに対して、これを 1 か所で実装したいと考えています。

タイプに独自の Value Provider (またはイベント Model Binder) を実装する必要decimalがありますか?それとも、これを行う簡単な方法を見逃していますか?

4

4 に答える 4

41

最もクリーンな方法は、独自のモデル バインダーを実装することです。

public class DecimalModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        return valueProviderResult == null ? base.BindModel(controllerContext, bindingContext) : Convert.ToDecimal(valueProviderResult.AttemptedValue);
        // of course replace with your custom conversion logic
    }    
}

Application_Start() 内に登録します。

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());

クレジット:デフォルトの ASP.NET MVC 3 モデル バインダーは 10 進数のプロパティをバインドしません

于 2013-01-18T14:14:44.240 に答える
5

グループセパレーターを適切に処理するには、単に置き換えます

Convert.ToDecimal(valueProviderResult.AttemptedValue);

選択した回答で

Decimal.Parse(valueProviderResult.AttemptedValue, NumberStyles.Currency);
于 2015-06-23T22:58:10.833 に答える
2
var nfInfo = new System.Globalization.CultureInfo(lang, false)
{
    NumberFormat =
    {
        NumberDecimalSeparator = "."
    }
};
Thread.CurrentThread.CurrentCulture = nfInfo;
Thread.CurrentThread.CurrentUICulture = nfInfo;
于 2014-10-15T10:26:36.910 に答える