2016-05-03 71 views
0

我對MVC很新,但是我一直試圖在視圖中使用下拉列表,該列表有一個類型爲列表<>的模型。這是因爲在單個頁面上創建多個記錄。mvc下拉列表與類型列表的模型

我已經能夠成功創建一個不是類型列表<>的視圖,並且一次只有一個記錄,但儘管存在大量的搜索結果,但在使用模型實現視圖時無法實現該解決方案類型列表<>。

型號

public class Product 
{ 
    public int ProductID { get; set; } 

    public string Description { get; set; } 

    public int VatRateID { get; set; } 

    [ForeignKey("VatRateID")] 
    public virtual VatRate VatRate { get; set; } 

} 

控制器

// GET: /Product/Bulkdata 
    public ActionResult BulkData() 
    { 
     PopulateVatRateDropDownList(); 
     List<Product> model = new List<Product>(); 
     model.Add(new Product 
         { 
          ProductID = 0, 
          Description = "", 
          VatRateID = 1 
         } 
       ); 
     return View(model); 
    } 

    // 
    // POST: /Product/Bulkdata 

    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult BulkData(
     [Bind(Include = "Description,VatRateID")] 
     List<Product> products) 
    { 

     try 
     { 
      if (ModelState.IsValid) 
      { 
       foreach (var p in products) 
       { 
        db.Product.Add(p); 
       } 
       db.SaveChanges(); 
       return RedirectToAction("Index"); 
      } 
     } 
     catch (DataException) 
     { 
      ModelState.AddModelError("", "Bulk - Unable to save changes, Try again, and if the probelm persists contact your administrator"); 
     } 
     PopulateVatRateDropDownList(); 
     return View(products); 
    } 

    private void PopulateVatRateDropDownList(object selectedVatRate = null) 
    { 
     var vatRateQuery = from v in db.VatRate 
          select v; 
     ViewBag.VatRateID = new SelectList(vatRateQuery, "VatRateID", "VatRateDescription", selectedVatRate); 
    } 

查看

@if (Model != null && Model.Count > 0) 
    { 
     int j = 0; 
     foreach (var i in Model) 
     { 

      <tr style="border:1px solid black"> 
       <td> 
        @Html.EditorFor(m => m[j].Description) 
        @Html.ValidationMessageFor(m => m[j].Description) 
       </td> 
       <td> 
        @Html.DropDownList("VatRateID", String.Empty) 
        @Html.ValidationMessageFor(m => m[j].VatRateID) 
       </td> 
       <td> 
        @if (j > 0) 
        { 
         <a href="#" class="remove">Remove</a> 
        } 
       </td> 
      </tr> 
      j++; 
     } 
    } 

當我運行這段代碼的應用程序,然後0總是過去回vatRateID。我已經嘗試了除上述以外的其他許多解決方案,包括 ASP.NET MVC DropDownListFor with model of type List<string>。正如我剛纔提到的,我對mvc很陌生,所以我知道可能有些簡單的東西我缺少。任何幫助將非常感激。

感謝

+0

你不能使用'foreach'循環。請參考[這個答案](http://stackoverflow.com/questions/30094047/html-table-to-ado-net-datatable/30094943#30094943) –

+0

而你使用'DropDownList()'沒有任何意義 - 它的綁定到'VatRateID',但你的模型是'List '和'List '不包含名爲'VatRateID'的屬性。您還可以使用'[Bind]'屬性排除綁定的所有內容。 –

+0

謝謝斯蒂芬,請你提供一個例子,我應該如何使用DropDownList()在上面的 – user2046411

回答

0

斯蒂芬在評論中回答:

在視圖中,改變了的foreach的for循環按照在斯蒂芬的評論文章,並使用DropdDownListFor

@Html.DropDownListFor(m => m[i].VatRateID, (IEnumerable<SelectListItem>)ViewBag.VatRateList)

而且修改控制器以將ViewBag屬性重命名爲VatRateList

' private void PopulateVatRateDropDownList(object selectedVatRate = null) { var vatRateQuery = from db inVatRate select v; ViewBag.VatRateID = new SelectList(vatRateQuery,「VatRateID」,「VatRateDescription」,selectedVatRate); } '