手动将SelectListItem添加到SelectList以在DropDownListFor中使用

Mar*_*eyn 8 c# asp.net selectlist html.dropdownlistfor asp.net-mvc-4

当我创建一个SelecList时,我希望能够手动添加SelecListItem并执行此操作,我使用以下代码:

List<SelectListItem> Provinces = new List<SelectListItem>();
Provinces.Add(new SelectListItem() { Text = "Northern Cape", Value = "NC" });
Provinces.Add(new SelectListItem() { Text = "Free State", Value = "FS" });
Provinces.Add(new SelectListItem() { Text = "Western Cape", Value = "WC" });

SelectList lstProvinces = new SelectList(Provinces);
Run Code Online (Sandbox Code Playgroud)

而不是这个:

var lstProvinces = new SelectList(new[] { "Northern Cape", "Free State", "Western Cape" });
Run Code Online (Sandbox Code Playgroud)

在我创建SelectList之后,我通过ViewBag将它传递给DropDownListFor:

Html.DropDownListFor(m => m.StartPointProvince, (SelectList)ViewBag.Provinces)
Run Code Online (Sandbox Code Playgroud)

但是,当我使用第一种方法创建SelectList时,它不起作用 - 它将3个值添加到下拉列表中,但所有值显示为: 码 *输出截图

但是,当我使用第二种方法时,它工作正常.我希望使用第一种方法,因为我希望能够指定每个项目的Text AND值.

Eug*_*kal 20

问题是,SelectList(IEnumerable)构造函数不接受SelectListItem(至少不是SelectListItem以增加其Items收藏).它只接受一些任意对象的集合,这些对象将用于生成完全不相关的内部SelectListItem集合.

如果需要,可以使用SelectList(IEnumerable, string, string)构造函数:

List<SelectListItem> Provinces = new List<SelectListItem>();
Provinces.Add(new SelectListItem() { Text = "Northern Cape", Value = "NC" });
Provinces.Add(new SelectListItem() { Text = "Free State", Value = "FS" });
Provinces.Add(new SelectListItem() { Text = "Western Cape", Value = "WC" });

this.ViewBag.Provinces = new SelectList(Provinces, "Value", "Text");
Run Code Online (Sandbox Code Playgroud)

它会工作.但这是不必要的,因为您创建了SelectListItem不会被其使用的复杂项目SelectList- 它只会将它们视为任何其他数据对象.

以同样的方式,您可以使用其他更简单的类来代替SelectListItem:

public class SelectListModel
{
    public String Text { get; set; }
    public String Value { get; set; }
}

...
Provinces.Add(new SelectListModel() { Text = "Northern Cape", Value = "NC" });
Run Code Online (Sandbox Code Playgroud)

  • +1用于指出SelectListItem在这种情况下是不必要的复杂.我也在创建List <SelectListItem>,因为我认为创建一个自定义的SelectOption类是浪费,但现在我看到SelectListItem是一个更复杂的对象,使用简单的自定义类没有任何行为更有意义 (4认同)

Joe*_*Joe 7

使用DropDownList并将其命名为与模型的属性名称相同。我的是“ ItemType”

     @Html.LabelFor(model => model.ItemType, new { @class = "control-label" })
     @Html.DropDownList("ItemType", (IEnumerable<SelectListItem>)ViewBag.ItemTypes, new { @class = "form-control" })
     @Html.ValidationMessageFor(model => model.ItemType, null, new { @class = "text-danger" })
Run Code Online (Sandbox Code Playgroud)

        var types = new List<SelectListItem>();
        types.Add(new SelectListItem() { Text = "Select...", Value = string.Empty });
        types.Add(new SelectListItem() { Text = "OTC", Value = "0" });
        types.Add(new SelectListItem() { Text = "Generic", Value = "1" });
        types.Add(new SelectListItem() { Text = "Brand", Value = "2" });
        types.Add(new SelectListItem() { Text = "Non-Merchandise", Value = "9" });

        ViewBag.ItemTypes = types;
Run Code Online (Sandbox Code Playgroud)
    [Required(ErrorMessage = "Item Type is required")]
    public Int32 ItemType { get; set; }
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以从更改代码

SelectList lstProvinces = new SelectList(Provinces);
Run Code Online (Sandbox Code Playgroud)

SelectList lstProvinces = new SelectList(Provinces, "Value", "Text");
Run Code Online (Sandbox Code Playgroud)

它将正确显示省份。