C# 使MVC3模型绑定器绑定到小数而不是整数时出现问题

C# 使MVC3模型绑定器绑定到小数而不是整数时出现问题,c#,.net,asp.net-mvc-3,C#,.net,Asp.net Mvc 3,我的网页中有一个AJAX调用,将以下数据发送到我的MVC3操作方法 { "name":"Test", "newitems":[ {"id":15,"amount":100,"unit":"gram"}, {"id":1,"amount":75,"unit":"gram"}, {"id":46,"amount":25,"unit":"gram"} ] } 在我的控制器中,我有以下类: public class NewDataItem { public st

我的网页中有一个AJAX调用,将以下数据发送到我的MVC3操作方法

{
  "name":"Test",
  "newitems":[
    {"id":15,"amount":100,"unit":"gram"},
    {"id":1,"amount":75,"unit":"gram"},
    {"id":46,"amount":25,"unit":"gram"}
  ]
}
在我的控制器中,我有以下类:

public class NewDataItem
{
  public string name { get; set; }
  public List<NewDataItemDetails> newitems { get; set; }
}

public class NewDataItemDetails
{
  public int id { get; set; }
  public int amount { get; set; }
  public string unit { get; set; }
}
公共类NewDataItem
{
公共字符串名称{get;set;}
公共列表newitems{get;set;}
}
公共类NewDataItemDetails
{
公共int id{get;set;}
公共整数金额{get;set;}
公共字符串单元{get;set;}
}
并且接收请求的操作方法有一个
NewDataItem
作为参数。这是完美的,但是NewDataItemDetails的amount属性可能并不总是包含int。例如,它可能是50.45。因此,我将行
public int amount{get;set;}
更改为
public decimal amount{get;set;}

在此更改之后,金额始终显示为0,而不是整数时的正确值

为什么MVC不能将值绑定到属性(当它是一个小数时,而它的工作方式与int一样好?

我发现了这个问题

如果我将行
“amount”:100,
更改为
“amount”:“100”,
它工作正常。MVC ModelBinder似乎可以管理字符串到十进制的转换,但不能管理int到十进制的转换。

您的类型(类)NewDataItemDetails属性amount是int类型

你让事情变得难以管理。如果您希望最终将amount设置为十进制,则可以简化为实际使用amount的类型作为十进制

这将避免您扩展默认的模型绑定器并满足您的行为


我认为,在ajax调用中以十进制形式发送金额更明智,也更简单。它提供了一致性。

我知道我有点晚了,但还有另一个解决方案,在MVC修复它之前,它不会改变任何东西(我相信它已经结束了)


在我的javascript中,如果我的值应该是一个十进制数,但却是一个整数,那么我会向它添加0.00001。对于那些我知道应该是货币价值的人,我知道这没有影响,并且会四舍五入。对于那些我不知道它们的值并且这可能会影响它的值,我在mvc中绑定后从值中删除0.00001。绑定工作正常,因为在mvc眼中这不再是一个int

请参见ryudice关于创建DecimalModelBinder的回答。它可以工作,还可以让所有的模型验证保持工作状态,(其他一些解决方案使用反序列化,这会停止验证工作。

如果您不想更改模型绑定器,那么您可以创建json对象并将金额转换为字符串。这对我来说很好

var test={"amount":""};
var test1={"amount":100}
test.amount=test1.amount.toString();

重复?是否所有输入值都为0,如“5”或“5.00”?@Sumo-很接近,但我没有完全相同的问题。ryudice get使用它,例如5.00,但我在5.00和5.00中都遇到相同的问题。在发送到服务器之前,您是否正在执行JSON.stringify?@alexanderb-是的,正如我所写的,除了在该字段中使用十进制外,JSON工作正常,因此ModelBinder otherw可以读取JSONise。在ajax调用中如何将其作为十进制发送?JavaScript不区分int和decimals。它只是JavaScript的数字。问题是,我希望在类中将该属性作为十进制,但它当前不起作用。这就是为什么它当前是int。但好消息是……我已经解决了:)有关详细信息,请参阅我的答案。是的,如果您将金额更改为十进制,则它将起作用。:)不,这是有效的,因为我在JSON数据中的实际数量周围添加了“”。当然,在发布这个问题之前,我试着在我的数据对象中将数据类型设置为decimal。当我可以把括号放在上面时,这似乎是一个不必要的攻击。