【问题标题】:Model Binding - Nullable decimal and double default to 0 instead of null?模型绑定 - 可空十进制和双精度默认为 0 而不是空?
【发布时间】:2013-01-20 05:08:41
【问题描述】:

当我的表单发布到我的控制器操作并且表单绑定到我的模型时,可空双精度和小数的空白表单值默认为 0,但可空整数的空白表单值默认为空。是这样吗?

我的模型有几个可以为空的字段的可为空类型。它具有可为空的整数、双精度和小数。然后我有一个常规表单,其中每个属性都有文本框,并且它们都默认为空白(空字符串)。当这个表单用所有空表单值发回我的控制器操作,并且它绑定到我的模型时,空的双精度和小数显示为 0,而空的整数为空。

在我看来,当传入一个空的表单值时,所有可为空的类型都应该默认为 null,但即使不是这种情况,双精度和小数与整数的处理方式似乎也很不一致。

【问题讨论】:

  • 碰巧:当你实例化你的模型时,在绑定到它之前,你的可为空的双精度和小数当时有什么值?
  • 如果你能发布代码会很有帮助。

标签: asp.net asp.net-mvc-3 model-binding


【解决方案1】:

这个问题似乎在 MVC4 中得到解决,因为我无法重现该问题。我的空文本框都将null 绑定回我模型的可为空的int、double 或decimal。没有问题。所以问题可能出在其他地方,或者这可能是 MVC3 中的一个错误,现在不再存在。

也就是说,如果您仍然遇到问题并且无法使用 MVC4,请尝试制作您自己的自定义模型绑定器来完成您需要做的事情。这是十进制的示例:

public class NullableDecimalBinder : IModelBinder {

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) {
        ValueProviderResult valueResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        ModelState modelState = new ModelState { Value = valueResult };
        object result = null;

        if (valueResult.AttemptedValue.Length > 0) {
            try {
                // Bonus points: This will bind using the user's current culture.
                result = Convert.ToDecimal(valueResult.AttemptedValue, System.Globalization.CultureInfo.CurrentCulture);
            } catch (FormatException e) {
                modelState.Errors.Add(e);
            } catch (InvalidOperationException e) {
                modelState.Errors.Add(e);
            }
        }

        bindingContext.ModelState.Add(bindingContext.ModelName, modelState);
        return result;
    }
}

然后,要使用它,将此行添加到您的 Global.asax 的Application_Start

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2015-05-30
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多