Привет, так что я довольно новичок в MVC3 и Razor, и я пытался разобраться с этим в последние несколько дней. Мой архитектор проекта дал мне задание создать вспомогательный метод, который сортирует выпадающий список в MVC View. У меня есть представление, которое получает различные данные из контроллера, и я возвращаю некоторые значения, которые я хочу отобразить в раскрывающемся списке. Мне сказали не сортировать его в контроллере, а также передавать поле, по которому мы хотим отсортировать, в вспомогательный метод. Я мог бы сделать это, как показано ниже, но архитектор хочет, чтобы представление было свободно от острого кода:
@Html.DropDownListFor(model => model.StudyName, new SelectList(ViewBag.StudyTypes, "Value", "Text").OrderBy(l => l.Text))
Итак, я создал пример кода и несколько методов расширения, чтобы попытаться заставить его работать. Моя идея состоит в том, чтобы скопировать существующий метод Html.DropDownList и разрешить передачу «object htmlAttributes», чтобы я мог установить стиль как часть вызова метода.
Вот мой код. Я возвращаю данные для раскрывающегося списка в ViewBag.StudyTypes в методе Edit Controller:
public ActionResult Edit(int id)
{
IEnumerable<SelectListItem> mySelectList = new List<SelectListItem>();
IList<SelectListItem> myList = new List<SelectListItem>();
for (int i = 0; i < 5; i++)
{
myList.Add(new SelectListItem()
{ Value = i.ToString(), Text = "My Item " + i.ToString(), Selected = i == 2 }
);
}
mySelectList = myList;
ViewBag.StudyTypes = mySelectList;
StudyDefinition studydefinition = db.StudyDefinitions.Find(id);
return View(studydefinition);
}
Вот мой код просмотра:
@model MyStudyWeb.Models.StudyDefinition
@using MyStudyWeb.Helpers
@{
ViewBag.Mode = "Edit";
}
<div>
@Html.DropDownListSorted(new SelectList(ViewBag.StudyTypes, "Value", "Text"))<br />
@Html.DropDownListSorted("MyList", new SelectList(ViewBag.StudyTypes, "Value", "Text"))<br />
</div>
Наконец, ниже приведены методы расширения, которые я пытаюсь заставить работать. Первый метод расширения ничего не делает, я просто получаю пробел в этой точке в представлении. Второй метод вроде работает, но он уродлив. Для третьего метода я не знаю, как указать параметр 'order by', так как OrderBy в IEnumerable ожидает выражение Linq.
namespace StudyDefinition.Helpers
{
public static class HtmlHelperExtensions
{
// 1st sort method: sort the passed in list and return a new sorted list
public static SelectList DropDownListSorted(this HtmlHelper helper, IEnumerable<SelectListItem> selectList)
{
var x = new SelectList(selectList.ToList()).OrderBy(l => l.Text);
return x as SelectList;
}
// 2nd sort method: return IHtml string and create <select> list manually
public static IHtmlString DropDownListSorted(this HtmlHelper helper, string name, SelectList selectList)
{
StringBuilder output = new StringBuilder();
(selectList).OrderBy(l => l.Text);
output.Append("<select id=" + name + " name=" + name + ">");
foreach (var item in selectList)
{
output.Append("<option value=" + item.Value.ToString() + ">" + item.Text + "</option>");
}
output.Append("</select>");
return MvcHtmlString.Create(output.ToString());
}
// 3rd sort method: pass in order by parameter - how do I use this?
public static IHtmlString DropDownListSorted(this HtmlHelper helper, string name, SelectList selectList, string orderBy)
{
StringBuilder output = new StringBuilder();
//How do I use the orderBy parameter?
(selectList).OrderBy(l => l.Text);
output.Append("<select id=" + name + " name=" + name + ">");
foreach (var item in selectList)
{
output.Append("<option value=" + item.Value.ToString() + ">" + item.Text + "</option>");
}
output.Append("</select>");
return MvcHtmlString.Create(output.ToString());
}
}
}
Я действительно не знаю, какой лучший подход выбрать, может быть, я совсем упускаю гораздо более простой способ, и я могу оказаться в том месте, где я больше не вижу древесину для деревьев. Некоторые вопросы
Должен ли я вернуть SelectList или MvcHtmlString, или что-то еще полностью?
Для первого метода расширения, как получить возвращенный список SelectList для отображения в представлении?
Как передать параметр в мои методы расширения, который определяет порядок сортировки?
Как передать параметр 'object htmlAttributes' и как применить этот объект / параметр к списку SelectList?
Если у кого-то есть идеи или предложения, я буду признателен за отзывы:)