【问题标题】:Problem getting the MVC3 model binder to bind to a decimal instead of an int让 MVC3 模型绑定器绑定到小数而不是 int 的问题
【发布时间】:2014-11-19 22:42:28
【问题描述】:

我的网页有一个 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; }

在这个变化量之后总是显示为 0,而不是它在 int 时所做的正确值。

当它是一个小数时,为什么 MVC 无法将值绑定到属性,而它作为 int 工作得很好?

【问题讨论】:

  • this one 的重复?
  • 对于所有输入值是否为 0,例如“5”或“5.00”?
  • @Sumo - 关闭,但我没有完全相同的问题。 ryudice 可以使用例如 5.00,但我在 5.00 和 5.00 中遇到了同样的问题。
  • 在发送到服务器之前你是在做 JSON.stringify 吗?
  • @alexanderb - 是的,正如我所写的,除了我在该字段中使用十进制时工作正常,否则 ModelBinder 可以很好地读取 json。

标签: c# .net asp.net-mvc-3


【解决方案1】:

在此处查看来自 ryudice 的Default ASP.NET MVC 3 model binder doesn't bind decimal properties 关于创建 DecimalModelBinder 的答案。它可以工作,并且还可以使所有模型验证正常工作,(其他一些解决方案使用反序列化可以阻止验证工作。

【讨论】:

    【解决方案2】:

    我发现了问题。

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

    【讨论】:

      【解决方案3】:

      您的类型(类)NewDataItemDetails 属性数量是 int 类型。

      你让事情变得难以管理。如果您希望最终将金额作为小数,它可以简化为实际使用金额的类型作为小数。

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

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

      【讨论】:

      • 如何在 ajax 调用中以十进制形式发送? JavaScript 不区分整数和小数。它只是 JavaScript 的数字。
      • 重点是我希望在我的班级中将该属性设为小数,但目前无法正常工作。这就是为什么它目前是一个 int。但好消息是……我解决了 :) 详情请参阅我的答案。
      • 是的,如果您将金额更改为小数,它将起作用。 :)
      • 不,它起作用了,因为我在 JSON 数据中的实际数量周围添加了“”。在发布问题之前,我尝试在我的数据对象中将数据类型设置为十进制。
      【解决方案4】:

      我知道我对此有点晚了,但是还有另一种解决方案可以在 MVC 修复它之前不做任何更改(我相信它已经结束了)。

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

      【讨论】:

      • 当我可以把括号放在上面时,这似乎是一个不需要的黑客。
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多