默认的ASP.NET MVC 3模型绑定程序不绑定十进制属性

时间:2011-04-18 05:45:04

标签: asp.net-mvc-3

出于某种原因,当我将此JSON发送给某个动作时:

{"BaseLoanAmount": 5000}

应该绑定到名为“BaseLoanAmount”的十进制属性的模型,它不绑定,它只保持0.但是如果我发送:

{"BaseLoanAmount": 5000.00}

它确实绑定了属性,但为什么呢?如果没有十进制数,不能将5000转换为十进制事件吗?

2 个答案:

答案 0 :(得分:71)

在进入asp.net mvc的源代码之后,似乎问题是对于转换,asp.net mvc使用框架的类型转换器,由于某种原因,对于int到十进制转换返回false,我最终使用了自定义模型绑定程序提供程序和小数位模型绑定程序,您可以在此处查看:

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());

答案 1 :(得分:12)

尝试像这样发送:

{ "BaseLoanAmount": "5000" }