让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?

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

在这里查看答案。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

眼中,这不再是一个int。

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

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