Html.DropDownList中可能存在错误,所选值不反映?

时间:2010-12-20 11:00:49

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

我知道之前已经问了几次,但现有的解决方案看起来像黑客而不是正确的模式。

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

我正在使用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:

alt text

但是,它没有反映在助手生成的Html中。没有...标签具有selected =“selected”属性。

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

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

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

2 个答案:

答案 0 :(得分:1)

好的......我刚修好了。

我改变了我的视图模型,使用了CategoryId而不是Category slug。现在,我的观点如下:

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

我认为选择的模型值(在这种情况下,a => a.CategoryId)必须与所选的“值”具有相同的类型。 (当我有更多的时间来讨论框架代码时,我会改进这个解释。)但实际上是聪明的编码:)对于ASP.NET MVC开发者来说。

现在,它按预期完美运行,并在PRG生命周期内保留对所选项目的更改。

希望这有助于某人。

答案 1 :(得分:0)

下拉项目中的选定属性实际上并未设置要在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;
            }
        }