web-dev-qa-db-ja.com

SelectListItemを手動でSelectListに追加して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つの値が追加されますが、すべての値は次のように表示されます。 Code *出力のスクリーンショット

ただし、2番目の方法を使用すると、正常に機能します。各アイテムのテキストと値を指定できるようにしたいので、最初の方法を使用したいと思います。

8
Marnus Steyn

問題は、 SelectList(IEnumerable)コンストラクターがSelectListItem 's を受け入れないことです(少なくともSelectListItemとしてItemsに追加することはできません)コレクション)。完全に無関係な内部SelectListItemsコレクションを生成するために使用される任意のオブジェクトのコレクションを単に受け入れます。

必要に応じて、次のような方法で 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" });
19
Eugene Podskal

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; }
6
Joe

コードを変更できます

SelectList lstProvinces = new SelectList(Provinces);

SelectList lstProvinces = new SelectList(Provinces, "Value", "Text");

州が正しく表示されます。

5
Tom Wass