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

Posted

技术标签:

【中文标题】MVC 方法从 ListBoxFor 方法输出无序列表【英文标题】:MVC Method to output unordered list from the ListBoxFor method 【发布时间】:2012-01-24 16:08:52 【问题描述】:

在 MVC3 中,我想通过 html.ListBoxFor 方法更改 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)

【问题讨论】:

【参考方案1】:

我想通了,下面的代码可以帮助其他人。基本上,我将参数传递给通用 ListBox 方法,取回生成的原始 HTML,然后使用 Linq to XML 仅将“选定”值抓取到字符串数组中。然后我遍历字符串数组并使用 TagBuilder("ul") 生成列表。我愿意接受任何有关使用此方法的 cmets 或批评。

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());

【讨论】:

你的调用字符串是什么样的?

以上是关于MVC 方法从 ListBoxFor 方法输出无序列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ListBoxFor 中删除选定的属性

如何在 Mvc3 中填充 ListBoxFor?

ASP.NET MVC 4 - ListBoxFor,在 ActionLink 中发送 selectedValue

将 ListBoxFor 绑定到 MVC 3 中的模型并使用另一个模型自动选择多个项目

如何在 ASP.NET MVC 中创建 CheckBoxListFor 扩展方法?

将 ListBoxFor(多个)绑定回模型