Lorsque je crée un SelecList, je souhaite pouvoir ajouter manuellement SelecListItem et pour ce faire j'utilise ce code:
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);
Au lieu de cela :
var lstProvinces = new SelectList(new[] { "Northern Cape", "Free State", "Western Cape" });
Après avoir créé la SelectList, je la transmets au DropDownListFor via le ViewBag:
Html.DropDownListFor(m => m.StartPointProvince, (SelectList)ViewBag.Provinces)
Cependant, lorsque je crée la SelectList en utilisant la première méthode, cela ne fonctionne pas - Il ajoute les 3 valeurs à la liste déroulante, mais toutes les valeurs s'affichent comme: * capture d'écran de la sortie
Cependant, lorsque j'utilise la deuxième méthode, cela fonctionne bien. Je souhaite utiliser la première méthode car je veux pouvoir spécifier le texte ET la valeur de chaque élément.
Le problème est que le constructeur SelectList(IEnumerable)
n'accepte pas les SelectListItem
(du moins pas comme SelectListItem
à ajouter à son Items
collection). Il accepte simplement la collection de certains objets arbitraires qui seront utilisés pour générer une collection interne SelectListItem
s complètement indépendante.
Si vous le souhaitez, vous pouvez utiliser le constructeur SelectList(IEnumerable, string, string)
de la manière suivante:
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");
Ça va marcher. Mais c'est inutile , car vous créez des éléments SelectListItem
complexes qui ne seront pas utilisés par le SelectList
- it les traitera comme n'importe quel autre objet de données.
De la même manière, vous pouvez simplement utiliser une autre classe plus simple à la place de SelectListItem
:
public class SelectListModel
{
public String Text { get; set; }
public String Value { get; set; }
}
...
Provinces.Add(new SelectListModel() { Text = "Northern Cape", Value = "NC" });
Utilisez DropDownList et nommez-le de la même manière que le nom de propriété du modèle. Le mien est "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; }
vous pouvez changer votre code
SelectList lstProvinces = new SelectList(Provinces);
à
SelectList lstProvinces = new SelectList(Provinces, "Value", "Text");
et il affichera correctement les provinces.