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つの値が追加されますが、すべての値は次のように表示されます。 *出力のスクリーンショット
ただし、2番目の方法を使用すると、正常に機能します。各アイテムのテキストと値を指定できるようにしたいので、最初の方法を使用したいと思います。
問題は、 SelectList(IEnumerable)
コンストラクターがSelectListItem
's を受け入れないことです(少なくともSelectListItem
としてItems
に追加することはできません)コレクション)。完全に無関係な内部SelectListItem
sコレクションを生成するために使用される任意のオブジェクトのコレクションを単に受け入れます。
必要に応じて、次のような方法で SelectList(IEnumerable, string, string)
constructorを使用できます。
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");
それが動作します。しかし、それは不要です。これは、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" });
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");
州が正しく表示されます。