MVC DropDownList的动态默认选择值

时间:2013-10-11 11:35:21

标签: c# asp.net-mvc html-select

我觉得这个问题的答案必须在几个地方,因为这个问题的变化似乎得到了很多。不幸的是,我无法准确掌握如何做我想要达到的目标,所以再次非常感谢你的帮助。

我有一个用户组列表,每个用户组都分配给一名工作人员。这是通过迭代用户组列表并显示每个用户组旁边的可用工作人员下拉来完成的。应该可以分配一名工作人员,因此应该有一个空值选择选项。

当创建一个新组时,将null值作为默认值很好,但是我只是更新现有记录,我希望下拉列表默认为具有匹配的员工成员ID的选项。

所以我查询可用的工作人员:

var rtrnStaff = (from st in db.PrmTbl_Staffs
    join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID
    where st.Active == true
    select new { st.ID, Name = sal.Desc + ". " + st.Name });

要在此数组中插入空白值:

List<SelectListItem> staff = new SelectList(rtrnStaff, "ID", "Name").ToList();
staff.Insert(0, (new SelectListItem { Text = "None", Value = "0" })); //can value be = null?

在我看来,对于创建新用户组的表单,我可以提供如下的下拉列表:

@Html.DropDownList( "staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"])

这提供了一个下拉列表,其中包含&#34;无&#34;选项首先,这很好。但是,当我为更新表单尝试相同的操作时,添加了一个默认值参数,它不起作用:

@Html.DropDownList( "staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], item.StaffID)

目的是当放置在foreach循环中时,匹配相关staffID的选项将显示为默认值。相反,&#34;无&#34;仍然是第一选择。

我确实试图只在我的控制器中查询表,在那里构建一个选择列表,但是直接通过ViewData将结果传递给View,然后在View中执行以下操作:

@Html.DropDownList("staffID", new SelectList(
    (System.Collections.IEnumerable) ViewData["Staff"], "ID", "Name", item.StaffID), 
    new { Name = "staffID" })

这不起作用,但没有&#34;没有&#34;选项。显然我需要一些中间立场!在DropDownList,DropDownListFor,List,SelectList等之间,我很困惑。

修改
(显示当前的代码状态)
控制器:

var rtrnStaff = (from st in db.PrmTbl_Staffs
    join sal in db.PrmTbl_Salutations on st.SalutationID equals sal.ID
    where st.Active == true
    select new { st.ID, Name = sal.Desc + ". " + st.Name });

    List<SelectListItem> staff = new SelectList(rtrnStaff, "ID", "Name").ToList();
    ViewData["StaffwNull"] = staff;

查看:

//show dropdown of all staff, 
//defaulting to "None" value (works)
@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], "None")

//show dropdown of all staff, 
//defaulting to value matching item.staffID (doesn't work)
//default selection is first list item 
//and list doesnt include "None" option
@foreach (var item in Model)
    {
        ...
        var thisStaffID = item.StaffID;
        ....
        @Html.DropDownList( "staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], thisStaffID)
    }

2 个答案:

答案 0 :(得分:0)

没有超载,您可以指定所选值。 MVC在ViewBag对象中搜索名为staffID的项目,并将其用作选定值。您可以使用DropDownList方法的this overload,该方法允许您指定选项标签:

@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], "None")

这会在顶部的选择列表中显示一个额外选项,因此您无需手动执行此操作。

旁注:你应该研究MVC模型绑定。

答案 1 :(得分:0)

您可以为下拉列表(this overload)提供ID,然后使用jQuery进行更新。

查看

@Html.DropDownList("staffID", (IEnumerable<SelectListItem>)ViewData["StaffwNull"], new { id = "dropdown1" })

<强>的jQuery

<script>
    $(document).ready(function () {
        $('#dropdown1').val('theValueYouWantSelected');
    });
</script>