我有一个订单模型(如下所示)
public class Order
{
//[Key]
[ScaffoldColumn(false)]
public int OrderId { get; set; }
[DisplayName("Order Date")]
public DateTime OrderDate { get; set; }
public virtual ProductSelection ProductSelection { get; set; }
public virtual ShippingDetails ShippingDetails { get; set; }
public virtual BillingDetails BillingDetails { get; set; }
public virtual CardDetails CardDetails { get; set; }
public virtual AccountUser AccountUsers { get; set; }
}
正如您所看到的,它由一组其他模型组成,例如ProductSelection(如下所示)。
public class ProductSelection
{
public int SimulatorId { get; set; }
public string VersionNumber { get; set; }
[DisplayName("Quantity")]
public int Quantity { get; set; }
[DisplayName("Total Price")]
[ScaffoldColumn(false)]
public decimal TotalPrice { get; set; }
}
我遇到的问题是当我发布到具有Order参数的Controller时,我无法从子模型中获取任何值(例如Order.ProductSelection.SimulatorId。)
任何想法为什么这不起作用,因为我当前必须使用不理想且更好的凌乱的FormCollection。
期待回复
史蒂夫
答案 0 :(得分:1)
1)愚蠢的问题,但只是为了确保....你是否在视图上保留子模型的值(在隐藏或任何其他输入类型的形式,确保隐藏的名称与您的属性相同模型中的名称)或查询字符串中的名称。
在为您提供完全加载的模型之前,模型绑定器会查看不同的位置以加载模型,如表单集合,路径数据和查询字符串
如果您没有在任何这些位置保留它们,那么模型绑定器无法找到这些值并为控制器操作提供加载值。
基础知识.. http://dotnetslackers.com/articles/aspnet/Understanding-ASP-NET-MVC-Model-Binding.aspx
2)您的示例模型似乎很好,但请确保您的子模型的所有属性都具有公共访问修饰符,并且它们必须在其属性声明中设置。 --->之前我遇到过同样的问题,因为我在这些属性上设置了私有访问修饰符,而且我整天浪费时间来解决这个问题。
3)如果没有任何作用(希望不是这样),那么最后你可以编写自己的模型装订器。 如果您决定朝这个方向前进,那么这是一篇好文章 http://buildstarted.com/2010/09/12/custom-model-binders-in-mvc-3-with-imodelbinder/
这是我的第一篇文章(在我的帐户下),感觉非常好参与.. !!
答案 1 :(得分:0)
您应该在ProductSelection
属性上应用ForeignAttribute,该属性指向ProductSelection
类的主键:
[ForeignKey("SimulatorId")]
public virtual ProductSelection ProductSelection { get; set; }
希望有所帮助。