如何将Html.Dropdownlist的值传递给Controller

时间:2012-04-24 16:23:26

标签: html asp.net-mvc-3 c#-4.0 razor

我正在动态生成一个下拉框。 我试图将下拉框中的选定值作为模型的一个字段发送给控制器。

@using (Html.BeginForm("AddItem", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
    {
        <label>
            Category:</label>
        @Html.DropDownList("Category", (IEnumerable<SelectListItem>)ViewData["CategoryList"])<br />
        <label>
            Sku:</label>
        @Html.TextBox("newItem.Sku")<br />
        <label>
            Title:</label>
        @Html.TextBox("newItem.Title")<br />

我可以将所有值作为模型的一部分发送,但Category(dropdownbox值)的值除外,因此使控制器中的函数失败。

答案:将下拉列表“类别”重命名为=“newItem.Category”,完成了工作,基本上应该与模型名称匹配。

3 个答案:

答案 0 :(得分:3)

为包含属性的项目创建ViewModel以保存所有类别和SelectedCategoryId值

public class ItemViewModel
{
  public int ItemId { set;get;}
  public string SKU { set;get;}
  public string SelectedCategoryId { get; set; }
  public IEnumerable<SelectListItem> Categories{ get; set; }
}

在您的家庭控制器中,为您创建ItemViewModel对象的Add的Create Action方法,设置Categories并返回强类型的View。

public ActionResult AddItem()
{
  ItemViewModel objNewItem=new ItemViewModel();
  objNewItem.Items = new[]
  {
     new SelectListItem { Value = "1", Text = "Perfume" },
     new SelectListItem { Value = "3", Text = "Shoe" },
     new SelectListItem { Value = "3", Text = "Shirt" }
  };
  return View(objNewItem);  

}

强类型视图

@model ItemViewModel
 @using (Html.BeginForm("AddItem", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
 {
   Category:
   @Html.DropDownListFor(x => x.SelectedCategoryId ,new SelectList(Model.Categories,"Value",Text"), "Select..")
   <input type="submit" value="Add" />
 }

在Home Controller中使用HTTPPOST AddItem方法

[HttpPost]
public ActionResult AddItem(ItemViewModel objItem)
{
  //Now you can access objItem.SelectedCategoryId and do what you like to do...

}

答案 1 :(得分:2)

您的DropDown绑定到名为Category的字段。所以你必须在视图模型上有这样的字段。

public class MyViewModel
{
    public string Category { get; set; }
    ...
}

和你的行动:

[HttpPost]
public ActionResult AddItem(MyViewModel model)
{
    // model.Category will contain the selected value
    ...
}

另请注意,此属性必须是简单的标量值(string,int,...),而不是复杂对象。

一旦你有一个改编的视图模型,你可以使用强类型的助手版本:

@model MyViewModel
@using (Html.BeginForm("AddItem", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.LabelFor(x => x.Category)
    @Html.DropDownListFor(x => x.Category, Model.Categories)
    <br />
    @Html.EditorFor(x => x.Sku)
    <br/>
    @Html.EditorFor(x => x.Title)
    ...
}

答案 2 :(得分:0)

将下拉列表“类别”重命名为=“newItem.Category”,完成了工作,基本上如果您希望在控制器中接收模型,在本例中为“newItem”,则下控制名称应与模型名称匹配和它的财产。