我知道之前已经问了几次,但现有的解决方案看起来像黑客而不是正确的模式。
我有一个简单的下拉列表。我试图用数据填充它并预先选择一个项目。我在“使用数据部分填充它”中取得了成功,但未能预先选择我的首选项目。
我正在使用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)有问题。
答案 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;
}
}