我有一个ViewModel,它包含以下结构:
public struct PricesAndDiscounts
{
public decimal FlatOff;
public decimal UnitPrice;
public decimal TotalDiscount;
public decimal TotalOptions;
public decimal TotalOrderPrice;
}
ViewModel处于层次结构中,因此存在类型为PriceAndDiscounts的属性,它是DisplayRowPriceViewModel的成员,DisplayRowPriceViewModel是ManageOrderEditModel的成员:
-ManageOrderEditModel
--DisplayRowPriceViewModel。
请求的“形状”完全符合我的预期和期望(参见表单项的Fiddler截图):
但是,在服务器上,默认的modelbinder将结构实例化为每个成员的零。 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; }
}
答案 0 :(得分:5)
您需要创建属性而不是像这样的字段:
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; }
}
希望它会奏效。
答案 1 :(得分:1)
我不确定您是如何做到的,但似乎传递数据的方式存在问题。
我刚创建了与你相同的模型,它成功地创建了结构并为其赋值。
然后我打电话使用PostMan。
这是我打电话的方式。 (我以Json的身份传递数据)
这是结果。
另一个解决方案是在结构中使用属性而不是字段。这是由@Imaran Rashid建议的。