让MVC3模型绑定器绑定到小数而不是整型时出现问题
本文关键字:绑定 整型 问题 模型 MVC3 小数 | 更新日期: 2023-09-27 18:06:38
我有一个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; }
}
和接收请求的Action方法有一个NewDataItem
作为参数。这是完美的,但是NewDataItemDetails的amount属性可能并不总是包含int。例如,它可能是50.45。因此,我将public int amount { get; set; }
改为public decimal amount { get; set; }
。
在此更改之后,amount总是显示为0,而不是当它是int时所显示的正确值。
为什么MVC不能绑定值到属性时,它是一个小数,当它工作只是一个int?
在这里查看答案。NET MVC 3模型绑定器没有绑定来自创建DecimalModelBinder的基准的十进制属性。它工作,它也保持所有的模型验证工作,(一些其他的解决方案使用反序列化可以阻止验证工作。
我找到问题了。
如果我改变行"amount":100,
到"amount":"100",
它工作得很好。看起来MVC ModelBinder可以管理字符串到十进制的转换,但不能管理int到十进制的转换。
您的type (class) NewDataItemDetails属性amount的类型是int.
你让事情变得难以管理。如果您希望最终得到的是小数形式的amount,可以简化为实际使用amount的十进制类型。
这将避免让您扩展默认模型绑定器并满足您的行为。
我认为,这是更明智的,它只是在ajax调用中发送小数的数量。
我知道我有点晚了,但有另一个解决方案,它的工作不改变任何东西,直到MVC修复它(我相信这是在他们的结束)。
在我的javascript我添加0.00001到我的值,如果它应该是一个小数,但是一个整数。对于那些我知道应该是货币价值的,我知道这没有影响,将会四舍五入。对于那些我不知道它们的值,这可能会影响它,我从mvc中绑定后的值中删除0.00001。绑定工作正常,因为在mvc
如果你不想更改模型绑定器,那么你可以创建json对象并将amount转换为字符串。这对我来说很好。
var test={"amount":""};
var test1={"amount":100}
test.amount=test1.amount.toString();