Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 模型绑定-可为空的十进制和双默认值为0而不是空?_Asp.net_Asp.net Mvc 3_Model Binding - Fatal编程技术网

Asp.net 模型绑定-可为空的十进制和双默认值为0而不是空?

Asp.net 模型绑定-可为空的十进制和双默认值为0而不是空?,asp.net,asp.net-mvc-3,model-binding,Asp.net,Asp.net Mvc 3,Model Binding,当我的表单发布到我的控制器操作,并且表单绑定到我的模型时,可空双精度和小数的空表单值默认为0,但可空整数的空表单值默认为null。是这样吗 我的模型有几个可以为空的字段的可空类型。它有可为空的整数、双精度整数和小数。然后我有一个常规表单,其中每个属性都有文本框,它们都默认为空(空字符串)。当此表单使用所有空表单值发布回我的控制器操作,并绑定到我的模型时,空的双精度和小数显示为0,空整数为null 在我看来,当传入一个空表单值时,所有可为null的类型都应该默认为null,但即使不是这样,双精度和

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

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


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

这个问题似乎在MVC4中得到了解决,因为我无法重现这个问题。我的空文本框都将
null
绑定回我模型的可空int、double或decimal。没有问题。因此,问题可能在其他地方,也可能这曾经是MVC3中的一个bug,现在不再是了

也就是说,如果您仍然遇到问题并且无法使用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;
    }
}
然后,要使用它,请将此行添加到您的全局。asax的
应用程序\u Start

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

偶然的机会:当你实例化你的模型时,在绑定到它之前,你的可空的双精度和小数在那个时候有什么值?如果你能发布代码,这将是很有帮助的。