2013-10-02 136 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; } 
}