Есть много способов для отображения коллекций на страницах в MVC-приложении. Одни из них это использование foreach. Сегодня покажу очень красивый метод с использованием лямбда-выражений, который я нашел, гуляя по просторам нашего интернета.
Итак, теперь по порядку. Мало кто знает, что при вызове функции какого-либо метода класса, первым параметром всегда передается сам класс (Кто пользуется программой Resharper могли заметить это ;) ). Этим-то мы и воспользуемся для написания расширения для класса HtmlHelper.
- Сперва создадим расширеня для коллекции IEnumerable. Создаем в проекте статический класс. Назовем его, например CollectionExtensions. Вот его функциональность:
public static void ForEach<T>(this IEnumerable<T> source, Action<T> action) { foreach (T item in source) { action(item); } }
Он нам понадобится в дальнейшем, чтобы не кастовать их в список, для которого уже есть такой метод ForEach.
- Теперь необходимо создать класс-хранитель расширения для класса HtmlHelper. Назовем его, например, RepeaterBuilder. Вот как он будет выглядеть (конечно, вы можете переделывать код как вам будет угодно):
public static class RepeaterBuilder { public static void Repeater<T>(this HtmlHelper helper, IEnumerable<T> items, string className, string classNameAlt, Action<T, string> render) { if (items == null) { return; } int i = 0; items.ForEach(item => render(item, i++ % 2 == 0 ? className : classNameAlt)); } }
- На странице импортируем пространство имен, в котором находится наш класс-хранитель, чтобы можно было использовать его методы. Для вывода какой-либо коллекции синтаксис будет выглядеть так (в моем случае используется коллекция категорий программного обеспечения):
<% Html.Repeater(Model.Categories, "row", "row-alt", (category, css) => { %> <div class="field-item <%= css %>"> <span> <%= category.CategoryName %></span> </div> <% }); %>
Вот результат (рис. 1):
Рис. 1. Результат использования repeater-расширения
Я использовал ещё jQuery для отображения. Вы можете ещё добавить свою функциональность для более детального отображения или переделать сам синтаксис под ваше ТЗ. =)
Комментариев нет:
Отправить комментарий