默认ASP.NETMVC 3模型绑定器不绑定十进制属性如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

出于某种原因,当我将这个JSON发送到一个动作时:

{"BaseLoanAmount": 5000}

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

{"BaseLoanAmount": 5000.00}

它会绑定属性,但为什么?如果不具有十进制数字,5000不能转换为十进制事件吗?

提问于
用户回答回答于

进入asp.net mvc的源代码后,似乎问题在于,对于转换,asp.net mvc使用了框架的类型转换器,由于某种原因,它将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());
用户回答回答于

试着像这样发送:

{ "BaseLoanAmount": "5000" }

扫码关注云+社区