C# SelectList构造函数未设置SelectListItem上的选定属性

C# SelectList构造函数未设置SelectListItem上的选定属性,c#,asp.net-mvc,razor,selectlistitem,C#,Asp.net Mvc,Razor,Selectlistitem,我正在创建一个SelectList以传递给Html.DropDownList,但似乎没有填充正确的值 var x = new SelectList(new[] { new SelectListItem() { Value="1", Text="Vanilla"}, new SelectListItem() { Value="2", Text="Chocolate"}, new SelectListItem() { Value="3", Text="Strawberry

我正在创建一个SelectList以传递给Html.DropDownList,但似乎没有填充正确的值

var x = new SelectList(new[] { 
    new SelectListItem() { Value="1", Text="Vanilla"}, 
    new SelectListItem() { Value="2", Text="Chocolate"},
    new SelectListItem() { Value="3", Text="Strawberry"}
}, "Value", "Text", "2");
应采用接受selectedValue的构造函数:

但这仅设置整个集合上的SelectedValue。单个SelectListItems尚未设置为已选定

我是否需要逐个迭代它们并为每个属性设置selected,如中所示?

SelectList构造函数正在设置所选属性。您显示的图像是针对items参数的,即您传递给该方法的SelectListItem的集合,而不是调用该方法的结果

构造函数不会修改传递给它的集合,它会创建一个新的IEnumerable,如果您检查var x的值,那么您将看到第二个SelectListItem,即值为2的Selected属性将设置为true

但是,SelectListItem类的用途是在HtmlHelper方法之一中使用,该方法生成DropDownList、DropDownListFor、ListBox和ListBoxFor方法,这些方法接受IEnumerable作为第一个或第二个参数

除非您明确未绑定到模型属性,例如@Html.DropDownListNotAModelProperty、model.YourSelectList,否则将忽略设置所选属性,因为该方法会根据绑定要参考的属性值设置所选选项以获取更多详细信息,因此,使用新的SelectList从第一个IEnumerable创建一个新的IEnumerable。。。这是毫无意义的额外开销

例如,使用SelectList构造函数的原因是从现有对象集合创建IEnumerable

IEnumerable<SelectListItem> options = new SelectList(db.Flavors, "ID", "Name")

您是否尝试将,Selected=true添加到要选择的SelectListItem中?@itsme86,这是一个简化的示例,只是为了使进入选择列表的值完全透明。在我的实际代码库中,这些代码都是从外部引入的。我可以遍历它们并手动设置selected属性,但在创建SelectList时传入选定值似乎会自动完成这项工作。此外,如果未设置项值上的选定值,则下拉列表不会填充初始值。使用新的SelectList从第一个值创建新的相同IEnumerable只是毫无意义的额外开销。当你绑定到一个属性时,设置所选属性将被忽略。它是决定所选内容的属性的值,你查看items属性时,你没有在其中任何一个属性上设置Selected=true,而不是该方法的结果IEnumerable。@StephenMuecke,啊,好的,我是想聪明一点。我没有将SelectList传递给ViewModel,而是创建了一个LookupProperty类,它只接受一个值和一个SelectList。那么我的模型上的属性就有这个类了。问题是,当我创建EditorForMyProp.Value时,模型绑定器工作得很好,但我没有在MyProp上获得任何数据验证属性。我试图使用EditorForMyProp,它带来了验证属性。我添加了一个ModelBinder到新的MyProp->MyProp.Value,但随后需要呈现类并指向该值
IEnumerable<SelectListItem> options = new SelectList(db.Flavors, "ID", "Name")
IEnumerable<SelectListItem> options = db.Flavors.Select(x => new SelectListItem
{
    Value = x.ID.ToString(),
    Text = x.Name
});