Метод MVC для вывода неупорядоченного списка из метода ListBoxFor - PullRequest
2 голосов
/ 20 декабря 2011

В MVC3 я хочу изменить вывод HTML с помощью метода Html.ListBoxFor, чтобы вместо поля списка HTML со всеми доступными значениями (и выделенными выделенными значениями), я просто хотел вывести неупорядоченный список (UL)., LI) выбранных элементов, а не элемента SELECT.Проблема заключается в том, что я хочу сохранить точно такую ​​же сигнатуру метода, что и у метода ListBoxFor , принимая объект MultiSelectList и List, который является выбранными значениями.Затем я хочу, чтобы неупорядоченный список выводил только выбранные значения элемента (не ключи) в виде HTML UL / LI.Вот подпись метода, которую я хотел бы иметь.Как это можно сделать?

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

1 Ответ

9 голосов
/ 21 декабря 2011

Я понял это, и код ниже на случай, если он кому-нибудь поможет.По сути, я передал параметры универсальному методу 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());
}
...