首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >默认的ASP.NET MVC3模型绑定器不绑定小数属性

默认的ASP.NET MVC3模型绑定器不绑定小数属性
EN

Stack Overflow用户
提问于 2011-04-18 13:45:04
回答 2查看 17.9K关注 0票数 47

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

代码语言:javascript
复制
{"BaseLoanAmount": 5000}

它应该被绑定到一个具有名为"BaseLoanAmount“的十进制属性的模型上,它没有绑定,只是保持为0。但是如果我发送:

代码语言:javascript
复制
{"BaseLoanAmount": 5000.00}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-23 04:32:11

在深入了解asp.net mvc的源代码后,似乎问题在于asp.net mvc使用了框架的类型转换器,由于某种原因,从整数到小数的转换会返回false,我最终使用了自定义的模型绑定器和小数的模型绑定器,你可以在这里看到:

代码语言:javascript
复制
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()

代码语言:javascript
复制
ModelBinders.Binders.Add(typeof(decimal), new DecimalModelBinder());
ModelBinders.Binders.Add(typeof(decimal?), new DecimalModelBinder());
票数 74
EN

Stack Overflow用户

发布于 2011-04-18 13:51:37

试着像这样发送:

代码语言:javascript
复制
{ "BaseLoanAmount": "5000" }
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5698984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档