1

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

@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”重命名为 =“newItem.Category”,完成了工作,基本上它应该与模型名称匹配。

4

3 回答 3

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; }
}

在您的家庭控制器中,为 Add 创建 Action 方法,在其中创建 ItemViewModel 的对象,设置类别并返回到强类型的视图。

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...

}
于 2012-04-24T16:48:56.830 回答
2

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

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

和你的行动:

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

另请注意,此属性必须是简单的标量值(字符串、整数、...),而不是复杂的对象。

一旦你有了一个适配的视图模型,你就可以使用强类型的助手版本:

@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)
    ...
}
于 2012-04-24T16:33:29.270 回答
0

将下拉列表“Category”重命名为 =“newItem.Category”,基本上,如果您希望在控制器中接收模型,在本例中为“newItem”,则向下控件名称应与模型名称及其属性匹配.

于 2012-09-06T21:25:22.737 回答