Skip to content

Instantly share code, notes, and snippets.

@domenu
Forked from frankgeerlings/gist:2635991
Last active August 29, 2015 14:11
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save domenu/bf59c55d93e566b21e25 to your computer and use it in GitHub Desktop.
Save domenu/bf59c55d93e566b21e25 to your computer and use it in GitHub Desktop.
public static class HtmlExtensions
{
public static IHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression,
Dictionary<string, IEnumerable<SelectListItem>> selectList)
{
/*
* <select name="tmodel">
* <optgroup label="Items">
* <option value="item">Item</option>
* </select>
*/
var select = new TagBuilder("select");
select.Attributes.Add("name", ExpressionHelper.GetExpressionText(expression));
select.Attributes.Add("id", ExpressionHelper.GetExpressionText(expression));
var propertyValue = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model;
var optgroups = new StringBuilder();
foreach (var kvp in selectList)
{
var optgroup = new TagBuilder("optgroup");
optgroup.Attributes.Add("label", kvp.Key);
var options = new StringBuilder();
foreach (var item in kvp.Value)
{
var option = new TagBuilder("option");
option.Attributes.Add("value", item.Value);
option.SetInnerText(item.Text);
if (item.Selected || (propertyValue != null && propertyValue.ToString() == item.Value))
{
option.Attributes.Add("selected", "selected");
}
options.Append(option.ToString(TagRenderMode.Normal));
}
optgroup.InnerHtml = options.ToString();
optgroups.Append(optgroup.ToString(TagRenderMode.Normal));
}
select.InnerHtml = optgroups.ToString();
return MvcHtmlString.Create(select.ToString(TagRenderMode.Normal));
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment