ASP.NET MVC DropDownListFor不支持SelectListItem.Selected

Wil*_*Niu 7 asp.net-mvc selectlist selectlistitem html.dropdownlistfor drop-down-menu

DropDownListFor用来在视图中呈现下拉列表.不知怎的,呈现的列表将不会选择SelectListItemSelected设置为true.

在控制器动作中:

var selectList = sortedEntries.Select(entry => new SelectListItem
                            {
                                Selected = entry.Value.Equals(selectedValue),
                                Text = entry.Value,
                                Value = entry.Id
                            });

return View(new DropDownListModel
            {
                ListId = id,
                SelectList = selectList,
                OptionLabel = "Click to Select"
            });
Run Code Online (Sandbox Code Playgroud)

在视图中:

<%= Html.DropDownListFor(m => m.ListId, 
    Model.SelectList, 
    Model.OptionLabel, 
    new {@class="someClass"}) %>
Run Code Online (Sandbox Code Playgroud)

我尝试过以下方法:

  1. 确保Selected设置为只有一个且只有一个项目true.
  2. 删除选项标签参数.
  3. 删除HTML属性对象.
  4. 使用SelectListDropDownListFor:

   Html.DropDownListFor(m => m.ListId, 
        new SelectList(Model.SelectList, "Value", "Text", 
             new List<SelectListItem>(Model.SelectList).Find(s => s.Selected)), 
        new {@class="someClass"})
Run Code Online (Sandbox Code Playgroud)

有什么问题的建议吗?

编辑:

更多信息:

  • 此操作是一个子操作,由另一个视图调用 HTML.RenderAction

Joh*_*eer 6

DropDownListFor将始终选择列表框所用的值,因此在这种情况下,它将查看ListId的值并在列表中选择该项.如果未在列表中找到ListId,则将选择第一个项目(或默认文本).如果你想要一个基于所选属性选择的列表,请使用DropDownList(没有For,在这种情况下你必须自己命名).

所以在你的情况下,这将工作:

var selectList = sortedEntries.Select(entry => new SelectListItem
{
    Text = entry.Value,
    Value = entry.Id
});

return View(new DropDownListModel
{
    ListId = selectedValue,
    SelectList = selectList,
    OptionLabel = "Click to Select"
});
Run Code Online (Sandbox Code Playgroud)


小智 5

我在同一个模型上遇到了同样的问题(决定中的其他模型没问题)

不起作用:

@Html.DropDownListFor(o => o.Drivers.ValueListItems.Value, Model.Drivers.ValueListItems, new { size = Model.Drivers.ValueSizeList, Multiple = "multiple" })
Run Code Online (Sandbox Code Playgroud)

功能完美,所选元素:

@Html.DropDownListFor(o => o.Drivers.ValueListItems.ToDictionary(u=>u.Value).Values, Model.Drivers.ValueListItems, new { size = Model.Drivers.ValueSizeList, Multiple = "multiple" })
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 4

尝试这样:

var selectList = sortedEntries.Select(entry => new SelectListItem
{
    Text = entry.Value,
    Value = entry.Id
});

return View(new DropDownListModel
{
    // The drop down list is bound to ListId so simply set its value
    // to some element value in the list and it will get automatically
    // preselected
    ListId = selectedValue, 
    SelectList = selectList,
    OptionLabel = "Click to Select"
});
Run Code Online (Sandbox Code Playgroud)

并在视图中:

<%= Html.DropDownListFor(
    m => m.ListId, 
    new SelectList(Model.SelectList, "Value", "Text"), 
    Model.OptionLabel, 
    new { @class = "someClass" }
) %>
Run Code Online (Sandbox Code Playgroud)

可能还有一个问题:您正在尝试更改 POST 操作中选定的值。例如,您渲染了一个表单,用户在下拉列表中选择了某个值,提交了表单,并在 POST 操作中对此选定的值进行了一些处理,当您重新显示视图时,您希望下拉列表选择其他一些值。在这种情况下,您必须删除 ModelState 中包含的初始选择,否则 Html 助手将忽略模型中的选定值:

// do this before returning the view and only if your scenario
// corresponds to what I described above
ModelState.Remove("ListId");
Run Code Online (Sandbox Code Playgroud)