2012-03-10 35 views
8

回發到控制器動作後失去了價值,我有我的視圖模型:視圖模型集合屬性在MVC 3

public class POReceiptViewModel 
{ 
    public virtual int PONumber { get; set; } 
    public virtual string VendorCode { get; set; } 

    public virtual IList<POReceiptItemViewModel> POReceiptItems { get; set; } 

    public POReceiptViewModel()   
    { 
     POReceiptItems = new List<POReceiptItemViewModel>(); 
    } 
} 

public class POReceiptItemViewModel 
{ 
    public virtual string ItemCode { get; set; } 
    public virtual string ItemDesription { get; set; } 
    public virtual decimal OrderedQuantity { get; set; } 
    public virtual decimal ReceivedQuantity { get; set; } 
    public virtual DateTime ReceivedDate { get; set; } 

    public POReceiptItemViewModel() 
    { 
     ReceivedDate = DateTime.Now; 
    } 
} 

然後我的控制器有兩個作用,一個get和一個崗:

public ActionResult CreatePOReceipt(int poNumber) 
{ 
    PurchaseOrder po = PurchasingService.GetPurchaseOrder(poNumber); 
    POReceiptViewModel poReceiptViewModel = ModelBuilder.POToPOReceiptViewModel(po); 
    return View("CreatePOReceipt", poReceiptViewModel); 
} 

[HttpPost] 
public ActionResult CreatePOReceipt(POReceiptViewModel poReceiptViewModel) 
{ 
    // Here the problem goes. The items in the poReceiptViewModel.POReceiptItems has lost. the count became zero. 
    return View("Index"); 
} 

在我的視圖中,我可以正確顯示模型並使用@ Html.HiddenFor <>我可以保留視圖模型數據,如我所願。但不在列表<>導航屬性。

@model POReceiptViewModel 

@using (Html.BeginForm()) 
{ 
    <fieldset> 
     <legend>Purchase Order</legend> 
     <label>For PO # :</label> 
     @Html.HiddenFor(m => m.PONumber)  
     @Html.DisplayTextFor(m => m.PONumber) 
     <label>Vendor Code :</label> 
     @Html.HiddenFor(m => m.VendorCode) 
     @Html.DisplayTextFor(m => m.VendorCode) 
    </fieldset> 

    <fieldset> 
     <legend>Received Items</legend> 

     <table class="tbl" id="tbl"> 
      <thead> 
      <tr> 
      <th>Item Code</th><th>Item Description</th><th>OrderedQuantity</th><th>Received Quantity</th><th>Received Date</th> 
      </tr> 
      </thead> 
      <tbody> 
      @Html.HiddenFor(m => m.POReceiptItems) // I'm not really sure if this is valid 
      @if (Model.POReceiptItems.Count > 0) 
      { 
       foreach (var item in Model.POReceiptItems) 
       {  
        <tr> 
         <td>@Html.DisplayTextFor(i => item.ItemCode)</td>@Html.HiddenFor(i => item.ItemCode)  
         <td>@Html.DisplayTextFor(i => item.ItemDesription)</td>@Html.HiddenFor(i => item.ItemDesription)  
         <td>@Html.DisplayTextFor(i => item.OrderedQuantity)</td>@Html.HiddenFor(i => item.OrderedQuantity) 
         <td>@Html.TextBoxFor(i => item.ReceivedQuantity)</td> 
         <td>@Html.TextBoxFor(i => item.ReceivedDate)</td> 
        </tr> 
       } 
      } 
      </tbody> 
     </table> 
    </fieldset> 
    <input type="submit" name="Received" value="Received" /> 
} 

的問題:表單提交時 POReceiptItems丟失。雖然我不想使用TempData [「POReceiptItems」] = Model.POReceiptItems,但即使使用它,輸入到ReceivedQuantity和ReceivedDate的值也不會保存到TempData中。

在此先感謝!

回答

10

嘗試

@for (int i = 0; i < Model.POReceiptItems.Count(); i++) 
{ 
<tr> 
    <td>@Html.DisplayTextFor(m => m.POReceiptItems[i].ItemCode)</td>@Html.HiddenFor(m => m.POReceiptItems[i].ItemCode)  
    <td>@Html.DisplayTextFor(m => m.POReceiptItems[i].ItemDesription)</td>@Html.HiddenFor(m => m.POReceiptItems.ItemDesription)                <td>@Html.DisplayTextFor(m => m.POReceiptItems[i].OrderedQuantity)</td>@Html.HiddenFor(m => m.POReceiptItems[i].OrderedQuantity) 
    <td>@Html.TextBoxFor(m => m.POReceiptItems[i].ReceivedQuantity)</td> 
    <td>@Html.TextBoxFor(m => m.POReceiptItems[i].ReceivedDate)</td> 
</tr> 
} 

也看過這個blog post瞭解模型綁定到一個列表中是如何工作的

+1

完美!提供解決方案,然後提供額外的閱讀是真棒!它現在以我期望的方式工作。我必須閱讀博客才能進一步瞭解它,因爲我是mvc的新手。 fyi,這是我在stackoverflow的第一篇文章,我在幾分鐘內得到了答案。 – marvs 2012-03-10 13:30:47

0

你失去了你的列表,因爲MVC不像你想象的那樣處理列表。

您應該使用BeginCollectionItem看看this post

+0

我也會讀你的博客..謝謝! – marvs 2012-03-10 13:34:58

0

我也有類似的問題,「列表」屬性返回沒有值(計數= 0),我嘗試了不同的方式和答案,並無法正常工作。 然後我自己嘗試,現在它正在工作,這是我的解決方案:

我發送一個具有一些常規屬性和一個「列表」的對象,之後,我用普通屬性和我的「列表」 。 在我的控制器(發佈ActionResult),在參數部分我添加了兩個參數,我的原始對象和我的「列表」作爲第二個參數,它的工作原理! 我希望這可以幫助你和其他有類似問題的人。