Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Default ASP.NET MVC 3 model binder doesn't bind decimal properties

For some reason, when I send this JSON to an action:

{"BaseLoanAmount": 5000} 

which is supposed to be bound to a model with a decimal property named "BaseLoanAmount", it doesn't bind, it just stays 0. But if I send:

{"BaseLoanAmount": 5000.00} 

it does bind the property, but why? Can't 5000 be converted to a decimal event if it doesn't have decimal numbers?

like image 900
ryudice Avatar asked Apr 18 '11 05:04

ryudice


1 Answers

After stepping into asp.net mvc's source code, it seemsd the problem is that for the conversion asp.net mvc uses the framework's type converter, which for some reason returns false for an int to decimal conversion, I ended up using a custom model binder provider and model binder for decimals, you can see it here:

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 } 

To register this ModelBinder, just put the following line inside Application_Start():

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder()); ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder()); 
like image 150
ryudice Avatar answered Oct 11 '22 13:10

ryudice