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

ryu*_*ice 46 asp.net-mvc-3

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

{"BaseLoanAmount": 5000}
Run Code Online (Sandbox Code Playgroud)

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

{"BaseLoanAmount": 5000.00}
Run Code Online (Sandbox Code Playgroud)

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

ryu*_*ice 73

在进入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
}
Run Code Online (Sandbox Code Playgroud)

要注册此ModelBinder,只需将以下行放入Application_Start():

ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());
Run Code Online (Sandbox Code Playgroud)

  • `return`语句`valueProviderResult == null`中的布尔表达式无法求值为true,因为之前的`valueProviderResult.AttemptedValue`会抛出null-ref异常. (4认同)
  • 注意:Phil Haack也建议这样做,http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx (2认同)
  • 我一直在使用你的原始解决方案来解决这个问题 - 谢谢!一个问题:以小数为目标的空值?字段被指定为零.我终于检查了`valueProviderResult.RawValue == null`以确定是否指定类型的默认值. (2认同)

Dar*_*rov 12

尝试像这样发送:

{ "BaseLoanAmount": "5000" }
Run Code Online (Sandbox Code Playgroud)

  • 我使用JSON.stringify来准备JSON,是否有服务器端解决方案?我不想弄乱客户端代码,因为它是ASP.NET MVC谁没有正确地工作. (2认同)
  • @ryudice,我担心javascript序列化程序处理数字格式的方式.当你开始使用可以为空的小数,浮点数时,事情可能变得更加混乱......你会发现很多不符点.无论如何根据JSON规范引用应该总是使用,所以我不太确定谁没有正确地完成他的工作.因此,您可能需要在将数字值转换为字符串之前将其转换为客户端. (2认同)