【问题标题】:Possible bug in Html.DropDownList, selected values not reflecting?Html.DropDownList 中可能存在错误,所选值未反映?
【发布时间】:2010-12-20 11:00:49
【问题描述】:

我知道这个问题已经被问过几次了,但现有的解决方案看起来像是 hack,而不是正确的模式。

我有一个简单的下拉列表。我正在尝试用数据填充它并预先选择一个项目。我在“使用数据部分填充它”方面取得了成功,但未能预先选择我的首选项目。

我正在使用 ASP.NET MVC 3 RC2。

重要的代码位:

{
    // Bunch of code
    CategoryOptions = new SelectList(categories, "Id", "Slug", article.Category.Id);
}

现在... CategoryOptions 正在传递给 Html 帮助器,如下所示:

@Html.DropDownListFor(a => a.Category, Model.CategoryOptions)

我查看了传递给帮助程序的值,并确认其中一项的选定值设置为 true:

但是,它并没有反映在助手生成的 Html 中。 ... 标记都没有 selected="selected" 属性。

我用 Reflector 稍微检查了一下代码,这行 (SelectExtensions.SelectInternal) 看起来有点冒险:

item.Selected = (item.Value != null) ? set.Contains(item.Value) : set.Contains(item.Text);

我在这里做错了吗?还是框架(ASP.NET MVC 3 RC2)有问题。

【问题讨论】:

    标签: .net asp.net-mvc viewmodel asp.net-mvc-3


    【解决方案1】:

    好的……我刚刚修好了。

    我更改了我的视图模型以使用 CategoryId 而不是 Category slug。所以现在,我的观点是这样的:

    @Html.DropDownListFor(a => a.CategoryId, Model.CategoryOptions, new { @class = "ask-category-field" })
    

    我认为选择的模型值(在这种情况下,a => a.CategoryId)必须与所选的“值”具有相同的类型。 (当我有更多时间回顾框架代码时,我会完善这个解释。)但确实是聪明的编码:) 向 ASP.NET MVC 开发人员致敬。

    现在,它可以按预期完美运行,并且在整个 PRG 生命周期中保留对选定项目的更改。

    希望这对某人有所帮助。

    【讨论】:

      【解决方案2】:

      下拉项上的 selected 属性实际上并未设置要在 HTML 中选择的下拉项。

      我自己也遇到过这个问题。

      我对此的解决方案是ViewDataDictionary 上的扩展方法,它允许您根据所选项目和选择列表的字符串 ID 设置给定选择列表的值。

      public static void SetSelectedValueFor(this ViewDataDictionary viewDataDictionary, string key, IEnumerable<SelectListItem> items)
              {
                  //  HACK: Store the selected item value in ViewData so that the DropDownListFor knows which one should be selected.
                  //  It's a bit of a hack but it seems to be the only way I can do it since DropdownListFor ignores the Selected property on SelectListItem.
                  var x = items.Where(c => c.Selected).FirstOrDefault();
                  if (x != null)
                  {
                      viewDataDictionary[key] = x.Value;
                  }
              }
      

      【讨论】:

      • 感谢您的回答...我还发布了我在发布问题几分钟后发现的答案。希望这对你也有帮助。
      猜你喜欢
      • 2017-12-21
      • 2013-08-03
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-04-17
      • 2013-07-18
      • 2011-06-16
      • 1970-01-01
      相关资源
      最近更新 更多