asp.net mvc 5.0下拉列表

时间:2016-01-15 11:49:34

标签: asp.net-mvc-5

我添加了一个带有以下代码的控制器。

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方法。

1 个答案:

答案 0 :(得分:0)

您需要为属性提供绑定和SelectList个不同的名称。您尝试将所选值绑定到名为ViewData的{​​{1}}属性,该属性为departments,但IEnumerable<SelectListItem>元素只能绑定到一个简单值({{1} },<select>等。)

在POST方法中返回视图时,内部发生的事情是

  1. int方法获取您的属性值 绑定到,在你的情况下是stringDropDownList()的{​​{1}}值
  2. 因为您绑定的属性值不是"System.Meb.Mvc.SelectList",a 新的.ToString()是从您那里生成的 提供。因为ViewData["departments"]中的所有选项都不匹配 null然后IEnumerable<SelectListItem>属性不是 因此必须选择第一个选项。
  3. 请注意,SelectList(和"System.Meb.Mvc.SelectList")方法会忽略在Selected构造函数中设置第4个参数,除非第一个参数的值为SelectList < / p>

    要正确执行此操作,首先要创建一个视图模型,以表示您想要显示/编辑的内容并强烈绑定到您的模型。

    DropDownList()

    ,关联的视图将是

    DropDownListFor()

    并且控制器方法将是

    null