2016-09-30 57 views
-2

嗨我想抓取所有用戶修改數據。控制器無法接收模型數據

我的問題是爲什麼控制器無法從我的項目中的視圖接收模型數據。

請解釋爲何導致此錯誤以及如何解決它。

型號:

public class ShoppingCart 
    { 
     public List<ShoppingCartItemModel> items = new List<ShoppingCartItemModel>(); 

     public IEnumerable<ShoppingCartItemModel> Items 
     { 
      get { return items; } 
     } 
    } 

    public class ShoppingCartItemModel 
    { 
     public Product Product 
     { 
      get; 
      set; 
     } 

     public int Quantity { get; set; } 
    } 

控制器

[HttpPost] 
     public RedirectToRouteResult EditFromCart(ShoppingCart MyModel) 
     { 
      ShoppingCart cart = GetCart(); 

      foreach (var CartItem in cart.items) 
      { 
       foreach (var ReceiveModelItem in MyModel.items) 
       { 
        if (CartItem.Product.ProductID == ReceiveModelItem.Product.ProductID) 
        { 
         CartItem.Quantity = ReceiveModelItem.Quantity; 
        } 
       } 
      } 

      return RedirectToAction("Index", "ShoppingCart"); 

     } 

查看

@model ShoppingCart 

@{ 
    ViewBag.Title = "購物車內容"; 
} 

<h2>Index</h2> 

<table class="table"> 
    <thead> 
     <tr> 
      <th> 
       Quantity 
      </th> 
      <th> 
       Item 
      </th> 
      <th class="text-right"> 
       Price 
      </th> 
      <th class="text-right"> 
       Subtotal 
      </th> 
     </tr> 
    </thead> 
    <tbody> 
     @using (Html.BeginForm("EditFromCart", "ShoppingCart", FormMethod.Post)) 
     { 
      foreach (var item in Model.items) 
      { 
       <tr> 
        <td class="text-center"> 
         @item.Product.ProductName 
        </td> 
        <td class="text-center"> 
         @item.Product.Price.ToString("c") 
        </td> 
        <td class="text-center"> 
         @((item.Quantity * item.Product.Price).ToString("c")) 
        </td> 
        <td class="text-left"> 

         @Html.EditorFor(model => item.Quantity, null, "UserInputQuantity") 

         @Html.Hidden("ProductId", item.Product.ProductID) 
        </td> 

       </tr> 
      } 
      <tr> 
       <td colspan="3"> 
        <input class="btn btn-warning" type="submit" value="Edit"> 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 
+0

如果需要其他信息,請告訴我 –

+0

有項目(實體的名單,在購物車中的這項事業的購物項目)的名單不能提交回控制器簡單的MVC/Razor。你將需要使用JavaScript來維護列表並將其作爲json等發佈。網絡上有很多關於開發MVC購物車的文章 – Emil

+0

@Emil當然你可以!你只需要適當地索引它們。模型聯編程序也可以綁定集合和列表。 – juunas

回答

0

名稱不正確地爲你的文字和隱藏的輸入設置:

@Html.EditorFor(model => item.Quantity, null, "UserInputQuantity") 

@Html.Hidden("ProductId", item.Product.ProductID) 

如果您檢查元素,您可以看到名稱分別爲UserInputQuantityProductId,但它們應分別爲 items[i].Quantityitems[i].Product.ProductID

你可以看看這個鏈接: MVC Model binding of complex objects

2

你必須明確地創建一個隱藏輸入要綁定在你的複雜對象的每個屬性。 IEnumerables和綁定不能直接打開盒子 - 它看起來像MVC有更好的基礎支持IList <>和數組,但您仍然必須枚舉集合併爲每個項目創建隱藏的輸入。看看這個link。所以,最好你的觀點應該是:

@model ShoppingCart 

@{ 
    ViewBag.Title = "購物車內容"; 
} 

<h2>Index</h2> 

<table class="table"> 
    <thead> 
     <tr> 
      <th> 
       Quantity 
      </th> 
      <th> 
       Item 
      </th> 
      <th class="text-right"> 
       Price 
      </th> 
      <th class="text-right"> 
       Subtotal 
      </th> 
     </tr> 
    </thead> 
    <tbody> 
     @using (Html.BeginForm("EditFromCart", "ShoppingCart", FormMethod.Post)) 
     { 
      for (int i = 0; i < Model.items.Count(); ++i) 
      { 
       <tr> 
        <td class="text-center"> 
         @Model.items[i].Product.ProductName 

        </td> 
        <td class="text-center"> 
         @Model.items[i].Product.Price.ToString("c") 

        </td> 
        <td class="text-center"> 
         @((Model.items[i].Quantity * Model.items[i].Product.Price).ToString("c")) 

        </td> 
        <td class="text-left"> 

         @Html.EditorFor(model => Model.items[i].Quantity) 


         @Html.HiddenFor(model => Model.items[i].Product.ProductID) 
         @Html.HiddenFor(model => Model.items[i].Product.ProductName) 
         @Html.HiddenFor(model => Model.items[i].Product.Price) 

        </td> 

       </tr> 
      } 
      <tr> 
       <td colspan="3"> 
        <input class="btn btn-warning" type="submit" value="Edit"> 
       </td> 
      </tr> 
     } 
    </tbody> 
</table> 
相關問題