代码之家  ›  专栏  ›  技术社区  ›  Lars Holdgaard

textboxfor for decimal忽略逗号作为十进制分隔符,尽管全球化设置为da dk

  •  -1
  • Lars Holdgaard  · 技术社区  · 6 年前

    我有一个简单的 TextBoxFor ,我用的是小数。在我的viewmodel中,小数点的定义如下:

        [DisplayName("Beløb")]
        public decimal Amount { get; set; }
    

    我在表格中使用这个,使用:

        <div class="form-group row">
            @Html.LabelFor(c => c.Amount, new { @class = "col-lg-3 control-label text-lg-right pt-2" })
            <div class="col-lg-6">
                @Html.TextBoxFor(c => c.Amount, new { @class = "form-control" })
                @Html.ValidationMessageFor(c => c.Amount)
            </div>
        </div>
    

    现在,在web.config中,我将全球化设置为 system.web :

    <globalization culture="da-DK" uiCulture="da-DK" />
    

    我的问题是:

    以下是我们在丹麦写数字的方法:

    500,50<--550美分

    如果我将此发送到服务器,逗号将被忽略,我的控制器将收到50050。

    我在这里做错什么了?我想web.config就足够了。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Lars Holdgaard    6 年前

    原来这是一个在stackoverflow上没有人能够修复的错误,因为我没有提供完整的图片。我会在这里留下答案,以防万一有人用谷歌搜索,这只是在绝望的时候再找一个地方。

    错误在我的global.asax中。我为小数建立了两个模型绑定:

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

    我的密码是:

     public class DecimalModelBinder : IModelBinder
        {
            public object BindModel(ControllerContext controllerContext,
                ModelBindingContext bindingContext)
            {
                var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
    
                if (valueProviderResult.AttemptedValue.Equals("N.aN") ||
                    valueProviderResult.AttemptedValue.Equals("NaN") ||
                    valueProviderResult.AttemptedValue.Equals("Infini.ty") ||
                    valueProviderResult.AttemptedValue.Equals("Infinity") ||
                        string.IsNullOrEmpty(valueProviderResult.AttemptedValue))
                {
                    return 0m;
                }
    
                try
                {
                    return Convert.ToDecimal(valueProviderResult.AttemptedValue, new CultureInfo("en-US"));
                }
                catch (Exception)
                {
                    return 0m;
                }
            }
        }
    

    修好之后,它就工作了。很明显。我是个白痴;)