2011-12-20 5 views
2

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

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

答えて

9

私はこれを理解し、コードは以下のとおりです。基本的には、ジェネリックなListBoxメソッドにパラメータを渡し、生成されたHTMLを元に戻し、XMLにLinqを使用して、「選択された」値だけを文字列配列に取り込みました。私はその後、文字列配列をループし、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()); 
} 
+0

あなたの呼び出し文字列はどのように見えますか? – David

関連する問題