.net Html.DropDownList中可能存在错误,所选值未反映?
我知道这已经被问过好几次了,但是现有的解决方案看起来像是黑客,而不是一个合适的模式 我有一个简单的下拉列表。我试图用数据填充它,并预先选择一个项目。我成功地完成了“用数据部分填充它”,但未能预先选择我的首选项 我使用的是ASP.NETMVC3RC2 重要的代码位:.net Html.DropDownList中可能存在错误,所选值未反映?,.net,asp.net-mvc,viewmodel,asp.net-mvc-3,.net,Asp.net Mvc,Viewmodel,Asp.net Mvc 3,我知道这已经被问过好几次了,但是现有的解决方案看起来像是黑客,而不是一个合适的模式 我有一个简单的下拉列表。我试图用数据填充它,并预先选择一个项目。我成功地完成了“用数据部分填充它”,但未能预先选择我的首选项 我使用的是ASP.NETMVC3RC2 重要的代码位: { // Bunch of code CategoryOptions = new SelectList(categories, "Id", "Slug", article.Category.Id); } 现在。。。C
{
// 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)在这里出错。下拉项上的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;
}
}
public static void SetSelectedValueFor(此ViewDataDictionary ViewDataDictionary、字符串键、IEnumerable项)
{
//HACK:将所选项目值存储在ViewData中,以便DropDownListFor知道应该选择哪个项目。
//这有点像黑客,但这似乎是我唯一能做到的方法,因为DropdownListFor忽略了SelectListItem上的Selected属性。
var x=items.Where(c=>c.Selected).FirstOrDefault();
如果(x!=null)
{
viewDataDictionary[key]=x.值;
}
}
好的。。。我刚修好
我改变了我的视图模型,使用CategoryId而不是Category slug。现在,我的观点是:
@Html.DropDownListFor(a => a.CategoryId, Model.CategoryOptions, new { @class = "ask-category-field" })
我认为被选择的模型值(在本例中,a=>a.CategoryId)必须与被选择的“值”具有相同的类型。(当我有更多的时间阅读框架代码时,我将完善这个解释。)但聪明的编码确实:)对ASP.NET MVC开发人员来说是帽子
现在,它可以像预期的那样完美地工作,并且在PRG生命周期中保留对所选项目的更改
希望这对某人有所帮助。谢谢您的回答。。。我还发布了我在发布问题几分钟后发现的答案。希望这对你也有帮助。