2011-12-20 2 views
2

MVC3에서 HTML 목록 상자 대신 사용 가능한 모든 값 (및 선택된 값이 강조 표시된) 대신 HTML 목록 상자가 변경되도록 Html.ListBoxFor 메서드로 HTML 출력을 변경하려고합니다. 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

저는 이것을 알아 냈습니다. 코드는 다른 사람에게 도움이됩니다. 기본적으로 생성 된 원시 HTML을 가져 오는 일반 ListBox 메서드에 매개 변수를 전달한 다음 XML에 Linq를 사용하여 "selected"값만 문자열 배열로 가져 왔습니다. 그런 다음 문자열 배열을 반복하고 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

관련 문제