Стандартное связывание модели ASP.NET MVC 3 не связывает десятичные свойства - программирование
Подтвердить что ты не робот

Стандартное связывание модели ASP.NET MVC 3 не связывает десятичные свойства

По какой-то причине, когда я отправляю этот JSON в действие:

{"BaseLoanAmount": 5000}

который предположительно связан с моделью с десятичным свойством с именем "BaseLoanAmount", он не связывается, он просто остается 0. Но если я отправлю:

{"BaseLoanAmount": 5000.00}

он связывает свойство, но почему? Не удается преобразовать 5000 в десятичное число, если оно не имеет десятичных чисел?

4b9b3361

Ответ 1

После перехода в исходный код asp.net mvc, кажется, проблема в том, что для преобразования asp.net mvc использует конвертер типа framework, который по какой-то причине возвращает false для преобразования int в десятичное преобразование, я в конечном итоге использовал поставщик связующего на заказ и модельное связующее для десятичных знаков, вы можете увидеть здесь:

public class DecimalModelBinder : DefaultModelBinder
{
    #region Implementation of IModelBinder

    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var valueProviderResult = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);

        if (valueProviderResult.AttemptedValue.Equals("N.aN") ||
            valueProviderResult.AttemptedValue.Equals("NaN") ||
            valueProviderResult.AttemptedValue.Equals("Infini.ty") ||
            valueProviderResult.AttemptedValue.Equals("Infinity") ||
            string.IsNullOrEmpty(valueProviderResult.AttemptedValue))
            return 0m;

       return Convert.ToDecimal(valueProviderResult.AttemptedValue);
    }    

    #endregion
}

Чтобы зарегистрировать этот ModelBinder, просто введите следующую строку внутри Application_Start():

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());

Ответ 2

Попробуйте отправить его следующим образом:

{ "BaseLoanAmount": "5000" }