ASP.NET MVC 5.2でひっそりとoptgroupがサポートされている


ASP.NET MVCのDropDownListForはoptgoupがサポートされていなくて残念な思いをしていましたが、5.2でひっそりとサポートされるようになりました。

新しいヘルパが増えるのではなく、System.Web.Mvc.SelectListItemクラスにGroupというプロパティが追加されていて、このプロパティにSystem.Web.Mvc.SelectListGroupオブジェクトを設定します。同じオブジェクトが設定されているSelectListItemがoptgroupとしてグルーピングされるという仕組みです。名前が同じだけではグルーピングされません。

var items = new List<SelectListItem>();

var group1 = new SelectListGroup() { Name = "Group 1" };
var group1_2 = new SelectListGroup() { Name = "Group 1" };
var group2 = new SelectListGroup() { Name = "Group 2" };

items.Add(new SelectListItem() { Text = "Item1", Group = group1 });
items.Add(new SelectListItem() { Text = "Item2", Group = group1 });
items.Add(new SelectListItem() { Text = "Item3", Group = group1_2 }); // 別のグループになる
items.Add(new SelectListItem() { Text = "Item4", Group = group2 });
items.Add(new SelectListItem() { Text = "Item5", Group = group2 });
items.Add(new SelectListItem() { Text = "Item6", Group = group1 }); // 初めのgroup1と一緒になる
items.Add(new SelectListItem() { Text = "Item7", Group = group1 }); // 初めのgroup1と一緒になる
@Html.DropDownList("select", items)

参考