模型绑定 - Nullable decimal和double默认为0而不是null?

时间:2013-01-20 05:08:41

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

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

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

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

1 个答案:

答案 0 :(得分:5)

这个问题似乎在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());