2012-01-13 75 views
2

我有一个订单模型(如下图所示)MVC3模型,而不是模型......不能看到张贴到控制器

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.ProductSelection.SimulatorId。)

任何想法,为什么这不工作,因为我不得不使用FormCollection这是不理想和更好的混乱。

期待回复

史蒂夫

+0

可能是一个愚蠢的问题,但为什么你的孩子对象被标记为“虚拟”? – tobias86 2012-01-13 22:25:32

+0

不确定,它们是否应该标记为公开? – swade1987 2012-01-13 22:26:21

+0

也许试着让它们变成“公共”。我可能会在这里说出它可能会影响ModelBinder如何将发布的数据绑定到Action的参数。 – tobias86 2012-01-13 22:28:37

回答

0

你应该在ProductSelection属性指向了ProductSelection类的主键应用ForeignAttribute:

[ForeignKey("SimulatorId")] 
public virtual ProductSelection ProductSelection { get; set; } 

希望有所帮助。

+0

您可以用RequiredAttribute替换ForeignKeyAttribute,它将根据需要标记关系并在数据库中生成ON DELETE CASCADE。 – 2012-01-13 22:30:42

+0

我现在就试试:) – swade1987 2012-01-13 22:32:11

+0

在每个子模型中都有SimulatorId属性,然后在Order中的每个模型上使用ForeignKey? – swade1987 2012-01-13 22:34:24

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/

这是我的第一篇文章(在我的帐户),它感觉很不错,参加.. !!

+0

多一个链接.. http://forums.asp.net/p/1559541/3846605.aspx(傻.. !! SO不允许我添加超过2个链接。) – 2012-01-14 18:49:58

+0

嗨阿米特, 许多感谢您的详细回复。 关于视图我有一个由JQuery手风琴制作的Order \ Index.cshtml文件,每个部分都包含一个局部视图(由一个特定的子模型组成,例如ProductSelection) 因此,我需要存储所有值)作为Order \ Index.cshtml文件中的隐藏字段,然后我将能够使用Order.ProductSelection.Quantity在控制器中访问它们。 – swade1987 2012-01-16 08:54:49

+0

您不一定必须将所有值存储在Index.cshtml中。如果你在partials中传递子模型,那么你可以将它们隐藏在你的partials中,并在你的表单中渲染部分内容。通过这种方式,您可以在视图中获得更多可读性。 – 2012-01-16 20:50:35

相关问题