我正在动态生成一个下拉框。 我试图将下拉框中的选定值作为模型的一个字段发送给控制器。
@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”,完成了工作,基本上应该与模型名称匹配。
答案 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”,则下控制名称应与模型名称匹配和它的财产。