Asp.net mvc MVC3模型代替了模型。。。can';过帐到控制器时看不到

Asp.net mvc MVC3模型代替了模型。。。can';过帐到控制器时看不到,asp.net-mvc,asp.net-mvc-3,model,formcollection,Asp.net Mvc,Asp.net Mvc 3,Model,Formcollection,我有一个订单模型(如下所示) 如您所见,它由一组其他模型组成,例如ProductSelection(如下所示) 我遇到的问题是,当我发布到具有Order参数的控制器时,我无法从子模型(例如Order.ProductSelection.SimulatorId)获取任何值 我现在不得不使用FormCollection,这不是很理想,也不是很凌乱 期待答复 Steve您应该在ProductSelection属性上应用ForeignAttribute,该属性指向ProductSelection类的主键:

我有一个订单模型(如下所示)

如您所见,它由一组其他模型组成,例如ProductSelection(如下所示)

我遇到的问题是,当我发布到具有Order参数的控制器时,我无法从子模型(例如Order.ProductSelection.SimulatorId)获取任何值

我现在不得不使用FormCollection,这不是很理想,也不是很凌乱

期待答复


Steve

您应该在
ProductSelection
属性上应用ForeignAttribute,该属性指向
ProductSelection
类的主键:

[ForeignKey("SimulatorId")]
public virtual ProductSelection ProductSelection { get; set; }
希望这会有所帮助。

1)愚蠢的问题,但只是为了确保……是否在视图(以隐藏或任何其他输入类型的形式,确保隐藏的名称与模型中的属性名称相同)或查询字符串中保留子模型的值。 在为您提供完全加载的模型之前,model binder会查看不同的位置来加载您的模型,如表单集合、路由数据和查询字符串 如果您没有在这些地方保存它们,那么model binder无法找到这些值并在控制器操作中为您提供加载的值。
基础知识

2) 您的示例模型看起来不错,但请确保子模型的所有属性都具有公共访问修饰符,并且它们必须在属性声明中设置。 --->我以前也遇到过同样的问题,因为我在那个些属性上设置了私有访问修饰符,我浪费了一整天的时间来弄清楚这一点

3) 如果什么都不起作用(希望不是这样),那么最后您可以编写自己的模型活页夹。 如果你决定朝那个方向走,这里有一个好帖子


这是我的第一篇帖子(在我的账户下),参与进来感觉真的很好

这可能是一个愚蠢的问题,但是为什么您的子对象被标记为
虚拟的
?不确定,它们应该被标记为公共的吗?也许可以尝试将它们仅仅标记为
公共的
。我可能会说这可能会影响ModelBinder将发布的数据绑定到操作参数的方式,这可能是一个冒险。当您将属性标记为虚拟实体框架时,使用延迟加载,您可以将ForeignKeyAttribute替换为RequiredAttribute,该属性会将关系标记为required并在删除时生成在数据库中级联。为什么在每个子模型中都有SimulatorId属性,然后在Order中的每个模型上使用ForeignKey?这是定义Order和ProductSelection类之间关系的方法。在ForeignKeyAttribute构造函数中,您应该使用引用类的主属性的名称但这是否意味着数据库中的订单记录仍将包含来自子模型的值?另一个链接。。(傻..!!所以不允许我添加超过2个链接。)你好,阿米特,非常感谢你的详细回复。关于视图,我有一个Order\Index.cshtml文件,它由JQuery手风琴组成,每个部分都包含一个局部视图(由特定的子模型组成,例如ProductSelection),因此我需要存储(子模型的)所有值作为Order\Index.cshtml文件中的隐藏字段,然后我将能够使用Order.ProductSelection.Quantity在控制器中访问它们。您不必在Index.cshtml中存储所有值。如果您在部分中传递子模型,则可以将它们隐藏在部分中,并在窗体中渲染部分。这样,您的视图将具有更高的可读性。
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; }
    }
[ForeignKey("SimulatorId")]
public virtual ProductSelection ProductSelection { get; set; }