【问题标题】:Dynamic default selected value for MVC DropDownListMVC DropDownList 的动态默认选择值
【发布时间】:2013-10-19 11:27:21
【问题描述】:

我觉得这个问题的答案必须存在于几个地方,因为这个问题的变体似乎被问了很多。不幸的是,我无法准确掌握如何做我想要实现的目标,因此再次非常感谢您的帮助。

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

创建新组时,将 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"])

这提供了一个下拉菜单,首先是“无”选项,这很好。但是,当我为我的更新表单尝试相同的操作时,添加了一个默认值参数,它不起作用:

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

目的是当放置在 foreach 循环中时,与相关人员 ID 匹配的选项将显示为默认值。相反,“无”仍然是第一个选项。

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

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

这没有问题,但没有“无”选项。显然我需要一些中间立场!在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)
    }

【问题讨论】:

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


    【解决方案1】:

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

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

    这会在顶部的选择列表中呈现一个额外的选项,因此您不必手动执行此操作。

    旁注:您应该查看 MVC 模型绑定。

    【讨论】:

    • 如果我无法指定选定的值,那么这对我的编辑表单没有用处,其中预先存在的值(匹配 item.staffID)是显示的默认选定值。使用您的线路,这不起作用 - 所有列表都默认为第一个值。
    • @Eamonn 它应该从staffID 获取选定的值。
    • 抱歉,Henk,我显然在某个地方出错了 - 我已更新问题以显示代码的当前状态 - 但列表仍默认为其第一个值
    【解决方案2】:

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

    查看

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

    jQuery

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

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 1970-01-01
      • 2013-09-17
      • 2016-07-12
      • 2014-10-05
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多