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

Leave a Reply