SelectListItem上的Selected属性未由SelectList构造函数

时间:2017-12-05 20:48:08

标签: 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"}
}, "Value", "Text", "2");

SelectList应该采用引用selectedValue

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

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

Inspector

我是否需要单独迭代它们并为每个设置选择this question

1 个答案:

答案 0 :(得分:1)

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

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

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

除非您明确没有绑定到模型属性(例如IEnumerable<SelectListItem>),否则将忽略设置@Html.DropDownList("NotAModelProperty", Model.YourSelectList)属性,因为该方法根据绑定的属性值设置所选选项(请参阅How to set “selectedValue” in DropDownListFor Html helper以获取更多详细信息),因此使用Selected从第一个创建新的IEnumerable<SelectListItem>是无意义的额外开销。

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

IEnumerable<SelectListItem>

将从IEnumerable<SelectListItem> options = new SelectList(db.Flavors, "ID", "Name") 表中获取记录,并根据其Flavors属性设置Value,并根据ID Text设置Name属性。它只是提供了使用(比如说)

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