Всемогущий, Google, найди мне чего-нибудь!

среда, 31 марта 2010 г.

Использование элемента Repeater в ASP.NET MVC

Есть много способов для отображения коллекций на страницах в 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 для отображения. Вы можете ещё добавить свою функциональность для более детального отображения или переделать сам синтаксис под ваше ТЗ. =)

Комментариев нет: