Биндер десятичной модели не работает
У меня есть пользовательский 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
,
Есть ли способ исправить код подшивки модели для защиты от подобных ошибок?