Связыватель модели ASP.NET MVC 3 по умолчанию не связывает десятичные свойства - PullRequest
46 голосов
/ 18 апреля 2011

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

{"BaseLoanAmount": 5000}

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

{"BaseLoanAmount": 5000.00}

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

Ответы [ 2 ]

72 голосов
/ 23 апреля 2011

После входа в исходный код asp.net mvc кажется, что проблема в том, что для преобразования asp.net mvc использует конвертер типов фреймворка, который по какой-то причине возвращает 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());
12 голосов
/ 18 апреля 2011

Попробуйте отправить это так:

{ "BaseLoanAmount": "5000" }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...