2013-10-02 91 views
1

我是新的MVC编程与剃刀,我需要你的建议我的代码有什么问题。剃刀模型不返回项目列表到控制器

我有一个模型

public class OrderDetails : OrderList 
{ 
     public string CompanyId { get; set; } 
     public List<OrderItems> OrdItems { get; set; } 
} 
public class OrderItems 
{ 
     public int Id { get; set; } 
     public string StopAddressName { get; set; } 
} 

我有填充数据的控制器。

public ActionResult Edit() 
{ 
     OrderDetails ordDtl = new OrderDetails(); 

     ordDtl.CompanyId = "1"; 
     ordDtl.OrdItems = new List<OrderItems>(); 
     for (int i = 1; i < 4; i++) 
     { 
      OrderItems tmp = new OrderItems(); 
      tmp.Id = i; 
      tmp.StopAddressName = "Street " + i; 
      ordDtl.OrdItems.Add(tmp); 
     } 

     return View("EditOrder", ordDtl); 
} 

当我发送它来查看它显示所有数据。这是我的观点。

@model OrderDetails 
@using (Html.BeginForm("Edit", "Orderlayouts", FormMethod.Post)) 
{ 
    <fieldset><legend>OrderDetail</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.CompanyId) 
     </div> 
     <div class="editor-field"> 
      @Html.TextBoxFor(model => model.CompanyId) 
     </div> 

     <table> 
      <tr> 
      <td>id</td> 
      <td>Address</td> 
      </tr> 
      @foreach (var itm in Model.OrdItems) 
      { 
      <tr> 
      <td>@itm.Id</td> 
      <td>@itm.StopAddressName</td> 
      </tr> 
      } 
      </table> 

<p> 
    <input type="submit" value="Edit" /> 
</p> 
    </fieldset> 
} 

当我点击提交按钮时,我在控制器CompanyID中,但OrdItems值变为空。你能指出我的代码出了什么问题吗? 这是我的控制器。

[HttpPost] 
public ActionResult Edit(OrderDetails Orderdt) 
{ 
    return View("EditOrder", Orderdt); 
} 

任何建议将不胜感激。

+1

除非我失去了一些东西在这里主要的,它看起来像你的唯一形式字段是CompanyID - 所以没有订单明细对象获取。 –

+1

您必须将数据添加到隐藏字段,因为mvc无法将数据解析到正确的对象中。 @ Html.HiddenFor(model => itm.Id) @ Html.HiddenFor(model => itm.StopAddressName) 这将序列化表单中的数据。 – Marko

回答

2

我会尝试做这样的事情。

@for (int i = 0; i < Model.OrdItems.Count; i++) 
{ 

@Html.DisplayFor(model => model.OrdItems[i].Id)@Html.HiddenFor(model => model.OrdItems[i].Id) 
@Html.DisplayFor(model => model.OrdItems[i].StopAddressName)@Html.HiddenFor(model => model.OrdItems[i].StopAddressName) 

} 
+0

他可以跳过HiddenFor注释。在这种情况下没有必要。只适用于你实际上不想展示的领域。 – Kiwanax

+0

嗯,我真的以为我无法获得displayfor保存值。我可以去看看,但真的很快。 –

+0

非常感谢。它按预期工作。我改变了foreach循环,是的,我需要HiddenFor,否则返回0。 – user2839793

0

模型绑定老实说是我的MVC工作的祸根。

但是,在这里,您将看到仅包含companyID的form样式帖子 - 在您的视图中没有其他表单字段用于绑定。

0

我假设OrderDetails是一个实体(通过实体框架绑定到数据库表)。对于具有列表类型导航属性的所有实体,您必须使用使用ICollection。此外,所有导航属性,无论是单个外键还是列表,必须为都是虚拟的。 EF实际上并不返回您的类,而是您的类的代理,并且导航属性被重写以返回适当的对象。如果它不是虚拟的,那么EF不能进行重写,而是得到一个空值。所以,你的模型应该是这样的:

public class OrderDetails : OrderList 
{ 
     public string CompanyId { get; set; } 
     public virtual ICollection<OrderItems> OrdItems { get; set; } 
}