手动将 SelectListItem 添加到 SelectList 以在 DropDownListFor 中使用
Adding SelectListItem manually to SelectList to use in DropDownListFor
当我创建 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);
而不是这个:
var lstProvinces = new SelectList(new[] { "Northern Cape", "Free State", "Western Cape" });
创建 SelectList 后,我通过 ViewBag 将其传递给 DropDownListFor :
Html.DropDownListFor(m => m.StartPointProvince, (SelectList)ViewBag.Provinces)
但是,当我使用第一种方法创建 SelectList 时,它不起作用 - 它将 3 个值添加到下拉列表中,但所有值都显示为:
*输出截图
但是当我使用第二种方法时,它工作正常。
我希望使用第一种方法,因为我希望能够指定每个项目的文本和值。
问题在于 SelectList(IEnumerable)
constructor doesn't accept SelectListItem
's(至少不能像 SelectListItem
添加到其 Items
集合中)。它只接受一些任意对象的集合,这些对象将用于生成完全不相关的内部 SelectListItem
s 集合。
如果你愿意,你可以这样使用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");
它会起作用的。但它是 不必要的 ,因为您创建了 SelectList
不会使用的复杂 SelectListItem
项目 - 它只会将它们视为任何其他数据对象。
以同样的方式,您可以使用其他更简单的 class 代替 SelectListItem
:
public class SelectListModel
{
public String Text { get; set; }
public String Value { get; set; }
}
...
Provinces.Add(new SelectListModel() { Text = "Northern Cape", Value = "NC" });
使用 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" })
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;
[Required(ErrorMessage = "Item Type is required")]
public Int32 ItemType { get; set; }
您可以从
更改您的代码
SelectList lstProvinces = new SelectList(Provinces);
至
SelectList lstProvinces = new SelectList(Provinces, "Value", "Text");
它会正确显示省份。
您不需要使用 SelectList
。
相反,将 List<SelectListItem>
Provinces 放入 ViewBag 和 return ViewBag。
然后在视图上放:
@Html.DropDownList("Dropwonlist", (IEnumerable<SelectListItem>)ViewBag.YourData)
当我创建 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);
而不是这个:
var lstProvinces = new SelectList(new[] { "Northern Cape", "Free State", "Western Cape" });
创建 SelectList 后,我通过 ViewBag 将其传递给 DropDownListFor :
Html.DropDownListFor(m => m.StartPointProvince, (SelectList)ViewBag.Provinces)
但是,当我使用第一种方法创建 SelectList 时,它不起作用 - 它将 3 个值添加到下拉列表中,但所有值都显示为:
但是当我使用第二种方法时,它工作正常。 我希望使用第一种方法,因为我希望能够指定每个项目的文本和值。
问题在于 SelectList(IEnumerable)
constructor doesn't accept SelectListItem
's(至少不能像 SelectListItem
添加到其 Items
集合中)。它只接受一些任意对象的集合,这些对象将用于生成完全不相关的内部 SelectListItem
s 集合。
如果你愿意,你可以这样使用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");
它会起作用的。但它是 不必要的 ,因为您创建了 SelectList
不会使用的复杂 SelectListItem
项目 - 它只会将它们视为任何其他数据对象。
以同样的方式,您可以使用其他更简单的 class 代替 SelectListItem
:
public class SelectListModel
{
public String Text { get; set; }
public String Value { get; set; }
}
...
Provinces.Add(new SelectListModel() { Text = "Northern Cape", Value = "NC" });
使用 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" })
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;
[Required(ErrorMessage = "Item Type is required")]
public Int32 ItemType { get; set; }
您可以从
更改您的代码SelectList lstProvinces = new SelectList(Provinces);
至
SelectList lstProvinces = new SelectList(Provinces, "Value", "Text");
它会正确显示省份。
您不需要使用 SelectList
。
相反,将 List<SelectListItem>
Provinces 放入 ViewBag 和 return ViewBag。
然后在视图上放:
@Html.DropDownList("Dropwonlist", (IEnumerable<SelectListItem>)ViewBag.YourData)