我有一个自定义的DecimalModelBinder,它使用当前的文化读取小数。这是BindModel实现
public override object BindModel( ControllerContext controllerContext, ModelBindingContext bindingContext ) {
var valueResult = bindingContext.ValueProvider.GetValue( bindingContext.ModelName );
var modelState = new ModelState { Value = valueResult };
object actualValue = null;
try {
if ( valueResult != null ) {
actualValue = Convert.ToDecimal( valueResult.AttemptedValue, CultureInfo.CurrentCulture );
}
else {
actualValue = Convert.ToDecimal( 0 );
}
}
catch ( FormatException e ) {
modelState.Errors.Add( e );
}
bindingContext.ModelState.Add( bindingContext.ModelName, modelState );
return actualValue;
}
当正确编写数字时,此实现非常有效。
假设我们必须代表数字thirty-seven
和twenty-two
。
如果CurrentCulture
为en-US
,则用户输入为37.22
如果currentCulture
为it-IT
,则用户输入为37,22
(注意小数分隔符不同)
在这种情况下,模型绑定器工作得非常好。
但是,如果CurrentCulture
是it-IT
且用户输入为37.22
(就像美国文化一样),则数字会在3722,00
中转换,因为该点是it-IT
中的千位分隔符。
有没有办法纠正模型绑定器的代码以防止这些类型的错误?