2

在 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)
4

1 回答 1

9

我想通了,下面的代码可以帮助其他人。基本上,我将参数传递给通用 ListBox 方法,取回生成的原始 HTML,然后使用 Linq to 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());
}
于 2011-12-21T02:33:53.560 回答