wir*_*_in 6 asp.net model-binding asp.net-mvc-3
当我的表单发布到我的控制器操作,并且表单绑定到我的模型时,可空双精度和小数的空白表单值默认为0,但可为空的整数的空白表单值默认为null.这是正确的吗?
我的模型有几个可以为空的字段的可空类型.它有可空的整数,双精度和小数.然后我有一个常规表单,其中包含每个属性的文本框,并且它们都默认为空(空字符串).当此表单以所有空表单值发回到我的控制器操作,并且它绑定到我的模型时,空的双精度数和小数数显示为0,空的整数为空.
在我看来,当传入一个空的表单值时,所有可空类型都应默认为null,但即使不是这种情况,看起来非常不一致,双精度和小数的处理方式与整数不同.
由于我无法重现该问题,因此MVC4中似乎已解决了该问题。我所有的空文本框都绑定回null模型的可为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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,要使用它,请将此行添加到您的Global.asax中Application_Start:
ModelBinders.Binders.Add(typeof(decimal?), new NullableDecimalBinder());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2001 次 |
| 最近记录: |