Asp.net-Mvc

在 MVC 3 中回發到控制器操作後,ViewModel 集合屬性失去了值

  • October 7, 2017

我有我的視圖模型:

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 和一個 post:

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<> 我可以根據需要保留視圖模型數據。但不在 List<> 導航屬性上。

@model POReceiptViewModel

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

   &lt;fieldset&gt;
       &lt;legend&gt;Received Items&lt;/legend&gt;

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

問題: 送出表單時,POReceiptItems 失去。盡可能我不想使用 TempData

$$ “POReceiptItems” $$= Model.POReceiptItems 但即使我使用它,輸入 ReceivedQuantity 和 ReceivedDate 的值也不會保存到 TempData 中。 提前致謝!

嘗試

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

另請閱讀此部落格文章以了解模型綁定到列表的工作原理

引用自:https://stackoverflow.com/questions/9646656