2013-02-14 43 views
2

好吧,所以我試圖使用一個列表框的視圖模型,以便當我添加項目到列表框,然後張貼表單,這些項目通過viewmodel繼續行動。模型和列表框

視圖模型:

public virtual ICollection<Sku> Skus { get; set; } //This is this items sku's 
public virtual ICollection<Sku> AllSkus { get; set; } //This is all sku's 

我的列表框看起來是這樣的:

@Html.ListBoxFor(m=>m.Skus, new MultiSelectList(Model.Skus, "Id", "Name"), new { id = "skuList", style="width: 200px; height: 100px" }) 

我有一個完整的,當我選擇一個,將其添加到使用jQuery列表框中的所有SKU的表。 (我會後下面所有的代碼)

我的接收行動(的SKU爲空):

[HttpPost] 
    public ActionResult AddProductOffering(ProductOfferingModel model) 
    { 

     return View(model); 
    } 

的項目在添加到列表框中就好了,但是模式仍然是後門柱空。

很明顯,我只是更新列表框而不是模型,我不知道如何將兩者以這種方式結合在一起。

任何幫助將不勝感激,謝謝!

(更新)全部.cshtml文件:

@using Web.ControlPanel.Helpers 
@model Web.ControlPanel.ViewModels.Offering.ProductOfferingModel 

@using (Html.BeginForm()) 
{ 

<h2>Product Offering</h2> 
<br /> 

@Html.LabelFor(m => m.Name) 
@Html.EditorFor(m => m.Name) 

<br /> 
<br /> 

<label>Offerings Skus</label><br/> 

@Html.ListBoxFor(m=>m.Skus, new MultiSelectList(Model.Skus, "Id", "Name"), new { id = "skuList", style="width: 200px; height: 100px" }) 

<br/><br/> 

<button class="button" type="submit" value="Save">Save</button> 

<br/><br/><br/> 

<h3>All Skus</h3> 

<p> 
    Search: @Html.TextBox("skuFilter") 
    <input type="submit" value="Search Skus" name="search" /> 
</p> 

<table class="onepx" style="width: 80%"> 
    <tr> 
     <td colspan="4" style="text-align: right;"> 
      @Html.Pager("List", Model.SkuPager, 3, (string)ViewBag.SkuFilter) 
     </td> 
    </tr> 
    <thead> 
     <tr style="font-weight: bold;"> 
      <td>Product</td> 
      <td>Sku</td> 
      <td>List Price</td> 
      <td>MSRP</td> 
      <td>Action</td> 
     </tr> 
    </thead> 
    <tbody> 

     @if (Model.Skus != null) 
     { 
      foreach (var sku in Model.AllSkus) 
      { 

       <tr> 
        <td> 
         @Html.DisplayFor(m => sku.Product.Name) 
        </td> 
        <td> 
         <label id="[email protected](sku.Id)">@sku.Name</label> 
        </td> 
        <td>[email protected](m => sku.ListPrice) 
        </td> 
        <td>[email protected](m => sku.Msrp) 
        </td> 
        <td> 
         <a href="#" class="AddSku" id="[email protected](sku.Id)">Add To Offering</a> 
        </td> 
       </tr> 

      } 
     } 
    </tbody> 
    <tfoot> 
    <tr> 
     <td colspan="4" style="text-align: right;"> 
      @Html.Pager("List", Model.SkuPager, 3, (string)ViewBag.SkuFilter) 
     </td> 
    </tr> 
</tfoot> 
</table> 
} 

@section Scripts { 
<script> 
    $(document).ready(function() { 

     //Array of skus 
     var skus = new Array(); 

     $('.AddSku').click(function(e) { 
      e.preventDefault(); 
      var id = e.target.id.replace("addSku", ""); 

      var exists = false; 

      for (var i = 0; i < skus.length; i++) { 
       if (skus[i] == id) { 
        exists = true; 
       } 
      } 

      if (!exists) { 
       var name = $("#skuName" + id).text(); 
       $('#skuList').append('<option value=' + id + '>' + name + '</option>'); 
       skus.push(id); 
      } 

     }); 

    }); 
</script> 

} 
+0

請發佈完整的.cshtml文件。 – Oliver 2013-02-14 23:51:59

回答

2

MVC不能在技術上結合的類型(或對象)的接口 - ICollection - 改變你的ICollection<T>List<T>。然後你需要看看List在ListBox中的顯示方式(select)。它應該以數組符號呈現,即類似於Sku[0] ... Sku[n]。你的jQuery需要以相同的數組表示法附加到select。閱讀Phil Haack的Model Binding to a List article瞭解更多信息。

+0

你是說我應該使用不同類型的列表框?這個呈現這樣的項目: 2013-02-15 15:55:49

+0

它適用於發佈模型,如果它是一個列表或一個ICollection ...但我將其更改爲一個列表,它仍然爲空。如果我選擇一個元素,它將不再爲空,但它仍然是空的......我只是想讓它給我列表中的所有值,而不是選定的值... – 2013-02-15 15:57:33

+0

感謝您的幫助,但我決定去另一種方式,一起跳過列表框... – 2013-02-15 21:42:59