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

Selected property on SelectListItem not being set by SelectList constructor

我正在创建一个 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");

SelectList 应该采用接受 selectedValue:

的构造函数
public SelectList(
    IEnumerable items,
    string dataValueField,
    string dataTextField,
    object selectedValue
)

但这只会在整个集合上设置 SelectedValue。个人 SelectListItems 尚未设置为 Selected

我是否需要像 this question 那样单独遍历它们并为每个设置选择项?

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

构造函数不会修改传递给它的集合,它会创建一个新的 IEnumerable<SelectListItem>,如果您检查 var x 的值,那么您会看到第二个 SelectListItem(带有 Value = "2" 的那个)将其 Selected 属性 设置为 true.

但是,SelectListItem class 的目的是用于生成 <select>HtmlHelper 方法之一(DropDownList()DropDownListFor()ListBox()ListBoxFor() 方法)接受 IEnumerable<SelectListItem> 作为第一个或第二个参数。

除非您明确不绑定到模型 属性(例如 @Html.DropDownList("NotAModelProperty", Model.YourSelectList)),否则设置 Selected 属性 将被忽略,因为该方法会根据所选选项设置关于您绑定的 属性 的值(有关更多详细信息,请参阅 ),因此使用 new SelectList(...) 从第一个创建新的 IEnumerable<SelectListItem> 是毫无意义的额外开销。

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

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

将从Flavorstable获取记录,并根据ID属性设置Value,[=39] =] 基于其 Name 属性。它只是提供了使用 (say)

的替代方法
IEnumerable<SelectListItem> options = db.Flavors.Select(x => new SelectListItem
{
    Value = x.ID.ToString(),
    Text = x.Name
});