1

我下面這個Tutorial on ASP.NET MVC,具體在哪裏,它指出提供的"MovieType"的Razor視圖字符串如下:@Html.DropDownList("MovieType")將提供關鍵的DropDownList找到在ViewBag屬性類型爲IEnumerable<SelectListItem>ASP.NET MVC的DropDownList值HttpPost

這工作得很好。

但是,我無法獲得用戶在我的方法中使用[HttpPost]屬性選擇的值。

這是我的代碼和迄今爲止我嘗試過的。

控制器

public class ProductController : Controller 
{ 
    private readonly ProductRepository repository = new ProductRepository(); 

    // Get: /Product/Create 
    public ActionResult Create() 
    { 
     var categories = repository.FindAllCategories(false); 
     var categorySelectListItems = from cat in categories 
             select new SelectListItem() 
              { 
               Text = cat.CategoryName, 
               Value = cat.Id.ToString() 
              }; 
     ViewBag.ListItems = categorySelectListItems; 
     return View(); 
    } 

    [HttpPost] 
    public ActionResult Create(Product product) 
    { 
     /** The following line is not getting back the selected Category ID **/ 
     var selectedCategoryId = ViewBag.ListItems; 
     repository.SaveProduct(product); 
     return RedirectToAction("Index"); 
    } 
} 

剃刀CSHTML查看

@model Store.Models.Product 

<h2>Create a new Product</h2> 

@using (@Html.BeginForm()) 
{ 
    <p>Product Name:</p> 
    @Html.TextBoxFor(m => m.ProductName) 

    <p>Price</p> 
    @Html.TextBoxFor(m => m.Price) 

    <p>Quantity</p> 
    @Html.TextBoxFor(m => m.Quantity) 

    <p>Category</p> 
    @Html.DropDownList("ListItems") 
    <p><input type="submit" value="Create New Product"/></p> 
} 

我試圖與重載玩DropDownList,但我沒能獲得值回了用戶的選擇。

如果有人看到我失蹤或有任何想法或建議,我將非常感激。謝謝!

更新

發佈Product模型。請注意,這是在創建.edmx時由Entity Framework自動生成的。

namespace Store.Models 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class Product 
    { 
     public long Id { get; set; } 
     public string ProductName { get; set; } 
     public decimal Price { get; set; } 
     public int Quantity { get; set; } 
     public System.DateTime DateAdded { get; set; } 
     public Nullable<long> CategoryId { get; set; } 

     public virtual Category Category { get; set; } 
    } 
} 
+0

您的產品對象是否有ListItems字段? –

+0

@DaveA Nope。但是,在我的第一個'Create()'方法中,我把它放到'ViewBag'中。我試圖弄清楚是否有一種方法可以將發送回[HttpPost]的屬性的「SelectListItem」下拉列表中的「獲取」。我真的不需要'SelectListItems'在用戶發佈時回來,只需要他們選擇的ID。 –

+0

ListItems是您綁定的變量。你需要ListItems參數或包含作爲參數的對象來操作方法 –

回答

6

您正在向您的視圖中傳入Store.Models.Product類型的模型。其他字段使用lambda表達式綁定到此模型,但@Html.DropDownList()未綁定到模型,因此在HTTPPost中返回模型時,選擇不在那裏。

您需要將Category字段添加到Store.Models.Product,然後綁定到使用列表:

@Html.DropDownListFor(m => m.Category, ViewBag.ListItems) 

然後MVC應該正確綁定您的輸入控制模型。

作爲一個例子,這個語法確實工作:

int[] listItems = {1, 2, 3, 4}; 
SelectList selectList = new SelectList(listItems); 
@Html.DropDownListFor(m => m.CategoryId, selectList); 

注意,從MultiSelectListSelectList繼承它實現IEnumerable<SelectListItem>

+0

這是一個更好的方法。我想知道它是否回答OP關於明確使用property-name-string方法以及爲什麼失敗的問題。 (側點,你沒有投下ViewBag「) –

+0

+1謝謝,你說的沒錯,我對模型沒有約束力,這讓我朝着正確的方向發展,但最終我無法使用你提供的lambda表達式,不知道爲什麼它不起作用,它不喜歡'm => m.Category'(我也試過'm => m.CategoryId')。 –

+0

這是正確的答案(基本上是Mike C指出的) –

2

遵循什麼彼得G.在他的回答提到,但只是參考,你也應該能夠安置自己的控制器改成這樣:

[HttpPost] 
public ActionResult Create(Product product, int ListItems) 
{ 

} 

正如Peter提到(再次使用他的回答),問題是當你的表單發佈時,你的DropDown列表的名稱是「ListItems」,並且你的控制器上沒有任何東西要綁定到它。

0

最後我做了以下內容:

控制器

... 
    [HttpPost] 
    public ActionResult Create(Product product) 
    { 
     var categoryId = product.CategoryId; 
     repository.SaveProduct(product); 
     return RedirectToAction("Index"); 
    } 
... 

剃刀CSHTML查看

... 
<p>Category</p> 
@Html.DropDownList("CategoryId", (IEnumerable<SelectListItem>) ViewData["ListItems"]) 
... 

它看起來醜陋,說實話,我不完全理解爲什麼我不能像Peter建議的那樣使用lambda表達式,@Html.DropDownListFor(m => m.CategoryId, ViewBag.ListItems)

對我來說,我已經「明白了」,但是想明白爲什麼,如果有更優雅的方式,我可以做到。

當我在@Html.DropDownListFor(m => m.CategoryId, ViewBag.ListItems)輸入,智能感知會自動補m.CategoryId,但隨後將其標記爲紅色,我會得到運行時錯誤。

+0

你的'Product'模型是什麼樣的? –

+0

@PeterGluck我更新了我的原始問題以包含它。它由EF生成。 –

+0

@Philip,請參閱我的答案中的示例。 –