0

我有一个剑道数字文本框

 @(Html.Kendo().NumericTextBoxFor(m => m.SomeDecimal)
                                    .Name("SomeDecimal")
                                    .Min(0)
                                    .Max(99999999)
                                    .Decimals(2)
                                  ) 

在发布包含此 NumericTextbox 的表单时,模型中 SomeDecimal 的值设置为 null。

请注意:我用普通文本框替换了 Kendo NumericTextbox 并且遇到了同样的问题,因为输入的数字包含句号 (.) 而不是逗号 (,)。当我用逗号替换句号时,一切都按预期工作。

我是否必须指定不同的文化?

4

1 回答 1

4

我找到了解决这个问题的方法,

我创建了一个新类 DecimalModelBinder 来覆盖十进制字段的默认模型绑定。代码如下。在这里我尝试转换十进制值,如果转换失败,我用逗号替换所有句号并尝试再次转换。如果第二次转换尝试失败,我将所有逗号替换为句号并重试。

public class DecimalModelBinder : IModelBinder
{
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        var modelState = new ModelState {Value = valueResult};
        object actualValue = null;
        try
        {
            // Try to convert the actual number that was recieved.
            actualValue = Convert.ToDecimal(valueResult.AttemptedValue, CultureInfo.CurrentCulture);
        }
        catch
        {
            try
            {
                // Replace any . with , and try to convert.
                actualValue = Convert.ToDecimal(valueResult.AttemptedValue.Replace('.',','), CultureInfo.CurrentCulture);
            }
            catch
            {
                try
                {
                    // Replace any , with . and try to convert.
                    actualValue = Convert.ToDecimal(valueResult.AttemptedValue.Replace(',', '.'), CultureInfo.CurrentCulture);
                }
                catch (Exception ex)
                {
                    modelState.Errors.Add(ex);                                               
                }
            }
        }

        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);

        return actualValue;
    }
}

您必须在 Global.asx 文件中添加 DecimalModelBinder

protected void Application_Start()
{
    RouteTable.Routes.MapHubs();
    AreaRegistration.RegisterAllAreas();

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

    // All other code.
}
于 2013-09-11T12:12:38.867 回答