【问题标题】:ModelBinding Issue with a Struct结构的模型绑定问题
【发布时间】:2014-12-31 09:26:36
【问题描述】:

我有一个 ViewModel,它包含以下结构:

public struct PricesAndDiscounts
{
    public decimal FlatOff;
    public decimal UnitPrice;
    public decimal TotalDiscount;
    public decimal TotalOptions;
    public decimal TotalOrderPrice;
}

ViewModel 处于层次结构中,因此有一个 PriceAndDiscounts 类型的属性,它是 DisplayRowPriceViewModel 的成员,它是 ManageOrderEditModel 的成员:
-ManageOrderEditModel
--DisplayRowPriceViewModel。

请求的“形状”正是我想要和期望的(参见 Fiddler 的表单项截图):

但是,在服务器上,默认的模型绑定器将结构实例化为每个成员的零。 ViewModel 中的其他所有内容都是由 ModelBinder 创建的,没有问题。

我是否需要为我的自定义结构创建自定义 ModelBinder?

编辑 - 添加更多细节
签名是:

public ActionResult ManageOrder([FromBody]ManageOrderEditModel model)

我试过没有 FromBody 属性。此外,PriceAndDiscounts 是一个结构这一事实也不是问题所在。我将其更改为一个类,所有成员都以零的形式出现,而不是您可以在 Fiddler 中从表单中看到的值。

ManageOrderEditModel

public class ManageOrderEditModel
{
    public DisplayOptionsInDropDownViewModel DisplayOptionsInDropDownViewModel { get; set; }
    public DisplayRowPriceViewModel DisplayRowPriceViewModel { get; set; }

    public int ID { get; set; }
    public int RegType { get; set; }
}

DisplayRowPriceViewModel

public class DisplayRowPriceViewModel
{
    public Discount Discount { get; set; }
    public int NumberOfAdditionalLocations { get; set; }
    public OrderStatus OrderStatus { get; set; }
    public double Price { get; set; }
    public PricesAndDiscounts PricesAndDiscounts { get; set; }
    public RegType  RegistrationType { get; set; }
    public decimal RowPrice { get; set; }
}

【问题讨论】:

  • 你能分享你的动作方法签名吗?我假设你正在向它发帖。
  • @Imran 我已经用更多信息编辑了帖子。干杯。
  • 它是 API 控制器吗?
  • @haim770 不。我尝试了 FromBody 属性作为冰雹玛丽。
  • 您能否分享一下您的视图模型代码,因为属性名称在模型绑定中非常重要?

标签: asp.net-mvc asp.net-mvc-5 modelbinders


【解决方案1】:

您需要创建属性而不是像这样的字段:

public struct PricesAndDiscounts
{
    public decimal FlatOff { get; set; }
    public int UnitPrice { get; set; }
    public decimal TotalDiscount { get; set; }
    public decimal TotalOptions { get; set; }
    public decimal TotalOrderPrice { get; set; }
}

希望它会奏效。

【讨论】:

  • 这绝对有效。谢谢。我从没想过向结构添加属性。
【解决方案2】:

我不确定您是如何做到的,但您传递数据的方式似乎存在问题。

我刚刚创建了与您相同的模型,它成功地创建了结构并为其赋值。

然后我打电话是使用 PostMan。

这是我打电话的方式。 (我将数据作为 Json 传递)

这是结果。

另一个解决方案是在结构中生成属性而不是字段。这是@Imaran Rashid 建议的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 2019-09-05
    相关资源
    最近更新 更多