MVC方法从ListBoxFor方法输出无序列表

big*_*mac 2 asp.net-mvc html-helper asp.net-mvc-3 html.listboxfor

在MVC3中,我想通过Html.ListBoxFor方法更改HTML输出,以便代替包含所有可用值的HTML列表框(以及突出显示的选定值),我想简单地输出无序列表(UL,LI)所选项目而不是SELECT元素.问题是我希望保持与ListBoxFor方法完全相同的方法签名,接受MultiSelectList对象和List,它是选定的值.然后,我希望无序列表仅输出所选项目值(而不是键)作为UL/LI html.这是我想要的方法签名.如何实现这一目标?

public static MvcHtmlString ListBoxForAsUnorderedList <TModel, TProperty>
    (this HtmlHelper<TModel> htmlHelper, 
          Expression<Func<TModel, TProperty>> expression, 
          IEnumerable<SelectListItem> selectList)
Run Code Online (Sandbox Code Playgroud)

big*_*mac 9

我想出了这个,代码在下面,以防它帮助其他人.基本上,我将参数传递给通用ListBox方法,获取生成的原始HTML,然后使用Linq到XML只将"选定"值抓取到字符串数组中.然后我循环遍历字符串数组并使用TagBuilder("ul")生成列表.我对使用此方法的任何评论或批评持开放态度.

public static MvcHtmlString ListBoxForAsUnorderedList<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList)
{
  var mvcHtmlString = System.Web.Mvc.Html.SelectExtensions.ListBox(htmlHelper, ExpressionHelper.GetExpressionText(expression), selectList, null);
  var selectedValues = XDocument.Parse(mvcHtmlString.ToHtmlString()).Descendants("option").Where(e => (string)e.Attribute("selected") == "selected").Select(e => e.Value).ToArray();
  var tag = new TagBuilder("ul");
  foreach (var value in selectedValues)
  {
    var itemTag = new TagBuilder("li");
    itemTag.SetInnerText(value);
    tag.InnerHtml += itemTag.ToString();
  }
  return new MvcHtmlString(tag.ToString());
}
Run Code Online (Sandbox Code Playgroud)