2010-12-20 50 views
0

我知道这已被问几次,但现有的解决方案看起来像黑客而不是一个适当的模式。Html.DropDownList中可能存在的错误,选择的值不反映?

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

我正在使用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”属性。

我使用反射来检查代码了一下,这条线(SelectExtensions.SelectInternal)看起来冒险:

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

难道我做错了什么吗?或者是框架(ASP.NET MVC 3 RC2)在这里出错。

回答

1

好吧......我只是修复它。

我改变了我的视图模型使用CategoryId而不是类别slug。所以,现在,我的看法是这样的:

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

我认为模型值被选择(在这种情况下,A => a.CategoryId)必须具有相同类型选择“值”。 (当我有更多的时间去了解框架代码时,我会对这个解释进行细化)。但是巧妙的编码的确是:) ASP.NET MVC开发者的帽子。

现在,它可以像预期的那样完美地工作,并且在整个PRG生命周期中保留对所选项目的更改。

希望这可以帮助别人。

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; 
      } 
     } 
+0

感谢您的回答......我也发布了问题发布后我发现的答案。希望这也能帮助你。 – kidoman 2010-12-20 11:12:43