我添加了一个带有以下代码的控制器。
TestDBEntities db = new TestDBEntities();
public ActionResult Populate()
{
var data = from d in db.Depts select d;
SelectList li = new SelectList(data, "DeptCode", "DeptName");
ViewData["departments"] = li;
return View();
}
[HttpPost]
public ActionResult Populate(FormCollection form)
{
var str = form["departments"];
ViewBag.d = str;
var data = from d in db.Depts select d;
SelectList li = new SelectList(data, "DeptCode", "DeptName",str);
ViewData["departments"] = li;
return View();
}
还为上面的操作方法“Populate”添加了一个视图,如下面的标记
@using (Html.BeginForm("Populate","Department", FormMethod.Post))
{
@Html.DropDownList("departments", (SelectList)ViewData["departments"], "Select Dept", new { @onchange = "this.form.submit();" })
<p>@ViewBag.d</p>
}
当我从下拉列表中选择值时,它会显示所选的值。但不会保留下拉选项。
请建议更正。另请告诉我如何有效地编写HttpPost
方法。
答案 0 :(得分:0)
您需要为属性提供绑定和SelectList
个不同的名称。您尝试将所选值绑定到名为ViewData
的{{1}}属性,该属性为departments
,但IEnumerable<SelectListItem>
元素只能绑定到一个简单值({{1} },<select>
等。)
在POST方法中返回视图时,内部发生的事情是
int
方法获取您的属性值
绑定到,在你的情况下是string
(
DropDownList()
的{{1}}值"System.Meb.Mvc.SelectList"
,a
新的.ToString()
是从您那里生成的
提供。因为ViewData["departments"]
中的所有选项都不匹配
null
然后IEnumerable<SelectListItem>
属性不是
因此必须选择第一个选项。请注意,SelectList
(和"System.Meb.Mvc.SelectList"
)方法会忽略在Selected
构造函数中设置第4个参数,除非第一个参数的值为SelectList
< / p>
要正确执行此操作,首先要创建一个视图模型,以表示您想要显示/编辑的内容并强烈绑定到您的模型。
DropDownList()
,关联的视图将是
DropDownListFor()
并且控制器方法将是
null