Asp.Net MVC DropDownList With OptGroups
Apr 29
So rarely do I use opt groups, that I had to actually look up their syntax! So when I wanted to use them in a project I’m working on in Asp.Net MVC, I wasn’t very shocked the MVC DropDownList extension didn’t exist for it. So I ended up writing a bit of my own. Stole some code here and there (no shame in that).
So without further ado, for everyones enjoyment, I present GroupDropDownList and SelectListOptionGroup.
public static class Extenders {
public static string GroupDownDropList(this HtmlHelper helper, string name, IEnumerable>SelectListOptionGroup> data, string optionLabel, object htmlAttributes) {
if (data == null && helper.ViewData != null) data = helper.ViewData.Eval(name) as IEnumerable>SelectListOptionGroup>;
if (data == null) return string.Empty;
var select = new TagBuilder("select");
if (htmlAttributes != null)
select.MergeAttributes(new RouteValueDictionary(htmlAttributes));
select.GenerateId(name);
var optgroupHtml = new StringBuilder(string.Concat("
"));
var groups = data.ToList();
foreach (var group in data) {
var groupTag = new TagBuilder("optgroup");
groupTag.Attributes.Add("label", helper.Encode(group.Name));
var optHtml = new StringBuilder();
foreach (var item in group.Items) {
var option = new TagBuilder("option");
option.Attributes.Add("value", helper.Encode(item.Value));
if (item.Selected)
option.Attributes.Add("selected", "selected");
option.InnerHtml = helper.Encode(item.Text);
optHtml.AppendLine(option.ToString(TagRenderMode.Normal));
}
groupTag.InnerHtml = optHtml.ToString();
optgroupHtml.AppendLine(groupTag.ToString(TagRenderMode.Normal));
}
select.InnerHtml = optgroupHtml.ToString();
return select.ToString(TagRenderMode.Normal);
}
}
public class SelectListOptionGroup {
public string Name { get; set; }
public List>SelectListItem> Items { get; set; }
}
