Asp.net mvc 结构的模型绑定问题

Asp.net mvc 结构的模型绑定问题,asp.net-mvc,asp.net-mvc-5,modelbinders,Asp.net Mvc,Asp.net Mvc 5,Modelbinders,我有一个ViewModel,其中包含以下结构: public struct PricesAndDiscounts { public decimal FlatOff; public decimal UnitPrice; public decimal TotalDiscount; public decimal TotalOptions; public decimal TotalOrderPrice; } ViewModel处于继承权中,因此有一个类型为Pri

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

public struct PricesAndDiscounts
{
    public decimal FlatOff;
    public decimal UnitPrice;
    public decimal TotalDiscount;
    public decimal TotalOptions;
    public decimal TotalOrderPrice;
}
ViewModel处于继承权中,因此有一个类型为Prices和Discounters的属性,它是DisplayRowPriceViewModel的成员,DisplayRowPriceViewModel是ManageOrderEditModel的成员:
-ManageOrderEditModel
--DisplayRowPriceViewModel

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

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

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

编辑-添加更多详细信息
签名为:

public ActionResult ManageOrder([FromBody]ManageOrderEditModel model)
我尝试过不使用FromBody属性。此外,价格和折扣是一个结构这一事实也不是问题所在。我把它改成了一个类,所有的成员都以零的形式出现,而不是你在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; }
}
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; }
}
DisplayRowPriceViewModel

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

    public int ID { get; set; }
    public int RegType { get; set; }
}
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; }
}

我不知道你是怎么做到的,但你传递数据的方式似乎有问题

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

然后我打电话给邮递员

这是我打电话的方式。(我以Json的形式传递数据)

这是结果


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

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

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

然后我打电话给邮递员

这是我打电话的方式。(我以Json的形式传递数据)

这是结果


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

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

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; }
}

希望它能起作用。

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

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; }
}

希望它能起作用。

你能分享你的行动方法签名吗?我想你是在发帖子。@Imran我已经用一些信息编辑了帖子。干杯。它是API控制器吗?@haim770否。我尝试了FromBody属性作为一个hail mary。您是否也可以共享视图模型代码,因为属性的名称在模型绑定中非常重要?您是否可以共享您的操作方法签名?我想你是在发帖子。@Imran我已经用一些信息编辑了帖子。干杯。它是API控制器吗?@haim770否。我尝试了FromBody属性作为一个冰雹玛丽。你也可以分享你的视图模型代码,因为属性的名称在模型绑定中非常重要吗?这绝对有效。谢谢我从未想过向结构中添加属性。这绝对有效。谢谢我从未想过向结构添加属性。