从这里阅读:ASP.NET MVC
已在控制器内创建了动作SelectCategory
-
public ActionResult SelectCategory() {
List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem { Text = "Action", Value = "0"});
items.Add(new SelectListItem { Text = "Drama", Value = "1" });
items.Add(new SelectListItem { Text = "Comedy", Value = "2", Selected = true });
ViewBag.MovieType = items;
return View();
}
我无法理解下一行中数据的绑定。
@Html.DropDownList("MovieType")
以类似的方式绑定数据,
@Html.DropDownList("IdList");
我获得以下错误 -
没有类型为'IEnumerable'的ViewData项 有'IdList'键。
控制器操作:
public ActionResult SelectId()
{
List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem { Text = "MyId1", Value = "MyId1", Selected=true });
items.Add(new SelectListItem { Text = "MyId2", Value = "MyId2" });
ViewBag.IdList = items;
return View();
}
我错过了什么?谢谢你的帮助!
答案 0 :(得分:22)
您已设置ViewBag.MovieType
=&gt;当您使用@Html.DropDownList("MovieType")
时,下拉列表将使用此值。当您编写@Html.DropDownList("IdList")
时,帮助程序在ViewBag中找不到相应的IdList
属性并抛出错误,因为它不知道从何处绑定数据。
或者,如果您想更改下拉列表的名称,可以使用以下内容:
@Html.DropDownList("SelectedMovieType", (IEnumerable<SelectListItem>)ViewBag.MovieType)
并且您的POST操作将有SelectedMovieType
参数来检索所选值。
但我会避免使用ViewBag。定义视图模型更好:
public class MyViewModel
{
public string SelectedMovieType { get; set; }
public IEnumerable<SelectListItem> MovieTypes { get; set; }
}
然后让您的控制器操作填充此视图模型并将其传递给视图:
public ActionResult SelectId()
{
List<SelectListItem> items = new List<SelectListItem>();
items.Add(new SelectListItem { Text = "MyId1", Value = "MyId1", Selected=true });
items.Add(new SelectListItem { Text = "MyId2", Value = "MyId2" });
var model = new MyViewModel
{
MovieTypes = items
};
return View(model);
}
并在您的强类型视图中:
@model MyViewModel
@Html.DropDownListFor(x => x.SelectedMovieType, Model.MovieTypes)
答案 1 :(得分:3)
在将列表绑定到DropDown时,您需要键入将其转换为IEnumerable,因为您使用的是@ Html.DropDown控件,该控件不是强类型与模型
在视图中
@Html.DropDownList("MovieType",(IEnumerable<SelectListItem>)ViewBag.MovieType)
以及另一种方式,如果你绑定IdList然后
@Html.DropDownList("IdList",(IEnumerable<SelectListItem>)ViewBag.IdList)
答案 2 :(得分:1)
数据绑定将数据绑定到模型的一种轻松方式:不要将剃须刀用于下拉列表。手动绑定它,使用FormCollection对象获取它。
控制器:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Sorun sorun,FormCollection fc)
{
//Define independently as form collection
sorun.GonderilecekBirim = fc["GonderilecekBirim"];
sorun.IlkSorulmaTarihi = DateTime.Now;
if (ModelState.IsValid)
{
db.Soruns.Add(sorun);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(sorun);
}
查看
@Html.LabelFor(model => model.GonderilecekBirim, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
<!-- Define as raw html -->
<select id="GonderilecekBirim" name="GonderilecekBirim">
<option value="4">Satın Alma</option>
<option value="5">Muhasebe</option>
</select>
@*@Html.ValidationMessageFor(model => model.GonderilecekBirim, "", new { @class = "text-danger" })*@
</div>