Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Html.DropDownList中可能存在错误,所选值未反映?_.net_Asp.net Mvc_Viewmodel_Asp.net Mvc 3 - Fatal编程技术网

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

.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

我知道这已经被问过好几次了,但是现有的解决方案看起来像是黑客,而不是一个合适的模式

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

我使用的是ASP.NETMVC3RC2

重要的代码位:

{
    // 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生命周期中保留对所选项目的更改


希望这对某人有所帮助。

谢谢您的回答。。。我还发布了我在发布问题几分钟后发现的答案。希望这对你也有帮助。