【问题标题】:ASP.NET MVC DropDownListFor does not honour SelectListItem.SelectedASP.NET MVC DropDownListFor 不支持 SelectListItem.Selected
【发布时间】:2011-07-14 06:54:31
【问题描述】:

我正在使用DropDownListFor 在视图中呈现下拉列表。不知何故,呈现的列表不会选择SelectListItem,而Selected 设置为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"
            });

在视图中:

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

我尝试了以下方法:

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

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

对出了什么问题有什么建议吗?

编辑

更多信息:

  • 这个动作是一个子动作,被另一个视图调用HTML.RenderAction

【问题讨论】:

    标签: asp.net-mvc drop-down-menu selectlist html.dropdownlistfor selectlistitem


    【解决方案1】:

    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"
    });
    

    【讨论】:

    • 我最终使用了DropDownList,它允许我为选择控件指定一个ID,以及在SelectListItem 中选择一个值。谢谢你的解释!
    【解决方案2】:

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

    不起作用:

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

    完美运行,所选元素:

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

    【讨论】:

    • 唯一的问题是控件的名称现在将是“Values”。
    【解决方案3】:

    试试这样:

    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"
    });
    

    在视图中:

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

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

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

    【讨论】:

    • ModelState.Remove("ListId") 是关键。谢谢。
    【解决方案4】:

    这个问题的解决方案比我们都认为的更简单......

    我们需要做的就是在视图模型上为下拉绑定到的元素设置属性 - 例如:ListId = 3

    当我们这样做时就这样

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

    HtmlHelper 会自动选取默认值显示在 DropDownList 上

    简单!

    希望它可以帮助您和所有其他人 - 像我一样! - 已经浪费了很多时间来寻找这个明显问题的解决方案。

    【讨论】:

      猜你喜欢
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多