asp.net - 模型绑定(bind) - 可空的小数和 double 默认为 0 而不是空?

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

当我的表单发布到我的 Controller 操作,并且表单绑定(bind)到我的模型时,可为空 double 和小数的空白表单值默认为 0,但可为空整数的空白表单值默认为 null。这是正确的吗?

我的模型对于多个可以为空的字段具有可为空的类型。它具有可为空的整型、 double 型和小数型。然后,我有一个常规表单,其中每个属性都有文本框,并且它们都默认为空白(空字符串)。当此表单使用所有空表单值发回到我的 Controller 操作,并且它绑定(bind)到我的模型时,空 double 和小数显示为 0,空整数为 null。

在我看来,当传入空表单值时,所有可空类型都应默认为 null,但即使情况并非如此, double 和小数的处理方式与整数的处理方式似乎非常不一致。

最佳答案

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

也就是说,如果您仍然遇到问题并且无法使用 MVC4,请尝试制作您自己的自定义模型绑定(bind)程序来准确执行您需要执行的操作。以下是十进制的示例:

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());

关于asp.net - 模型绑定(bind) - 可空的小数和 double 默认为 0 而不是空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14421852/

相关文章:

c# - 为什么我的try catch在asp.net C#中不起作用

asp.net-mvc-3 - MVC3 : How can I route non-SSL requests automatically to the SSL protocol?

asp.net-mvc-3 - 如何使用HandleError只处理特定类型的Exception,并让其余的Exceptions正常抛出?

c# - ASP.NET RouteValueDictionary 包含带键 "RouteModels"的条目

c# - 在 Swagger 下拉列表和 json 上显示枚举成员友好名称

javascript - 使用 IFrame 时将 JS 放在哪里

javascript - 使用 JQuery Ajax 将 Json 对象数组发送到 Web 方法

asp.net - IsClientScriptIninclude注册的问题

c# - 使用 Fluent NHibernate 和 MVC 3 的 SqlDateTime 溢出

c# - 使用 System.ComponentModel.DataAnnotations 进行模型绑定(bind)