为什么 Html.ListBox 的初始多项选择不可见?

Why are the initial multiple selections of an Html.ListBox not visible?

我正在测试一个新插件,它可以将多个 select 列表框转换为一组多个相互排斥的单个 select 下拉列表。这应该是非常直接的,因为我只是想从一些项目开始 selected,但到目前为止我还没有找到答案。

我已将问题简化为以下简单的控制器代码(插件已关闭,因此不是一个因素):

List<SelectListItem> selectList2 = db.LookupType.Select(x => new SelectListItem() { Selected = x.LookupTypeId < 4, Value = x.LookupTypeId.ToString(), Text = x.Name }).ToList();
ViewBag.LookupTypeId2 = selectList2;

这将在前三项上标记 Selected = true,因为 ID 从 1 开始(在调试器中确认前 3 项具有 Selected = true)。

视图看起来像这样:

@Html.ListBox("LookupTypeId2", (IEnumerable<SelectListItem>)ViewBag.LookupTypeId2, htmlAttributes: new { @class = "form-control"})

结果输出 没有 selected 项目:

<select name="LookupTypeId2" class="form-control" id="LookupTypeId2" multiple="multiple">
    <option value="1">Degree</option>
    <option value="2">WorkdayLanguage</option>
    <option value="3">Language_Ability_Type_ID</option>
    <option value="4">National_ID</option>
    <option value="5">Phone_Device_Type_ID</option>
    <option value="6">Background_Check_Status_ID</option>
    <option value="7">Educational_Institution_Type_ID</option>
    <option value="8">Gender_Code</option>
    <option value="9">Military_Status_ID</option>
    <option value="10">Ethnicity_ID</option>
</select>

我可以使用 CTRL-Click 等 select 倍数,但初始 select 离子不可见。我在这里错过了什么?

更新: 根据下面的答案,我将其更改为 ListBoxFor

@Html.ListBoxFor(x=>x.LookupTypeId2, (IEnumerable<SelectListItem>)ViewBag.LookupTypeId2, htmlAttributes: new { @class = "form-control"})

已添加以下值初始化:

List<SelectListItem> selectList2 = db.LookupType.Select(x => new SelectListItem() { Selected = x.LookupTypeId < 4, Value = x.LookupTypeId.ToString(), Text = x.Name }).ToList();
lookup.LookupTypeId2 = new string[]{"1","2","3","4"};
ViewBag.LookupTypeId2 = selectList2;

还按照建议尝试使用 int 数组:

List<SelectListItem> selectList2 = db.LookupType.Select(x => new SelectListItem() { Selected = x.LookupTypeId < 4, Value = x.LookupTypeId.ToString(), Text = x.Name }).ToList();
lookup.LookupTypeId2 = new int[]{1,2,3,4};
ViewBag.LookupTypeId2 = selectList2;

但仍然没有 selected。

首先你需要一个 属性 来绑定。多个 select 只会 post 支持值类型的集合,但您试图绑定到 List<SelectListItem>。添加一个 属性(比如说)public int[] SelectedItems { get; set; } 到你的模型然后使用

@Html.ListBoxFor(m => m.SelectedItems, (IEnumerable<SelectListItem>)ViewBag.LookupTypeId2, htmlAttributes: new { @class = "form-control"})

然后如果 SelectedItems 的值匹配任何选项,这些选项将被 selected,例如如果 model.SelectedItems = new int[] { 2, 10 }; 那么第二个和最后一个选项将是 selected 当你显示页面时。当您绑定到 属性.

时,您不会(也不应该)设置 SelectListItemSelected 属性