2

MVC3では、Html.ListBoxForメソッドによるHTML出力を変更して、使用可能なすべての値(および選択された値が強調表示されている)を含むHTMLリストボックスの代わりに、順序付けされていないリスト(UL、​​LI)を出力するようにします。 SELECT要素ではなく、選択されたアイテムの。問題は、ListBoxForメソッドとまったく同じメソッドシグネチャを保持し、MultiSelectListオブジェクトと選択された値であるListを受け入れることです。次に、順序付けされていないリストで、選択したアイテムの値(キーではない)のみをUL /LIhtmlとして出力するようにします。これが私が欲しいメソッドシグネチャです。これはどのように達成できますか?

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 に答える