MVC3模型代替模型...发布到控制器时无法看到

时间:2012-01-13 22:22:19

标签: asp.net-mvc asp.net-mvc-3 model formcollection

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

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。

期待回复

史蒂夫

2 个答案:

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

希望有所帮助。