Биндер десятичной модели не работает

У меня есть пользовательский 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,

Есть ли способ исправить код подшивки модели для защиты от подобных ошибок?

0 ответов

Другие вопросы по тегам