Полоса строк таблицы в ASP.NET MVC (без использования jQuery или эквивалента)

При использовании ASP.NET WebForms Элемент управления ListView для отображения данных в таблице HTML я использую следующую технику для "полоски" строки таблицы:

<ItemTemplate>
    <tr class="<%# Container.DisplayIndex % 2 == 0 ? "" : "alternate" %>">
        <!-- table cells in here -->
    </tr>
</ItemTemplate>

Со следующим CSS:

tr.alternate
{
    background-color: #EFF5FB;
}

Я только что прошел через ASP.NET MVC Учебник по базе данных о фильмах и узнал, что в строках таблицы MVC могут быть (необходимо быть?) построены следующим образом:

<% foreach (var item in Model) { %>
    <tr>
        <td>
            <%= Html.Encode(item.Title) %>
        </td>
        <!-- and so on for the rest of the table cells... -->
    </tr>
<% } %>

Что я могу добавить в этот код, чтобы разбить строки моей таблицы?

Примечание. Я знаю, что это может быть выполненное с использованием jQuery, я хочу знать, можно ли это сделать другим путем.

Изменить

Если jQuery (или эквивалент), на ваш взгляд, лучший или самый подходящий пост, мне было бы интересно узнать, почему.

Ответ 1

Другой вариант, который не включает lambdas и немного чище, чем то, что вы получили, может быть...

<% int i=0; foreach (var item in Model) { %>
    <tr class="<%= i++ % 2 == 0 ? "alternate" : "" %>">
        <td>
            <%= Html.Encode(item.Title) %>
        </td>
        <!-- and so on for the rest of the table cells... -->
    </tr>
<% } %>

Ответ 2

Как насчет метода расширения?

public static void Alternate<T>(this IEnumerable<T> items, Action<T, bool> action)
{
    bool state = false;
    foreach (T item in items)
        action(item, state = !state);
}

Таким образом вы могли бы сказать:

<% movies.Alternate((movie, alt) => { %>
  <tr class="<%= alt ? "alternate" : "" %>">
    <td>
        <%= Html.Encode(movie.Title) %>
    </td>
    <!-- and so on for the rest of the table cells... -->
  </tr>
<% }); %>

Измените, кроме того, если вы хотите использовать индекс, вы можете использовать метод расширения следующим образом:

public static void Each<T>(this IEnumerable<T> items, Action<T, int> action)
{
    int state = 0;
    foreach (T item in items)
        action(item, state++);
}

Ответ 3

Как насчет этого:

<% foreach (var item in Model.Alternating("alternate","") { %>
<tr class="<%= item.ClassName %>">
    <td>
        <%= Html.Encode(item.Model.Title) %>
    </td>
    <!-- and so on for the rest of the table cells... -->
</tr>
<% } %>

Что использует этот метод расширения:

 public class AlternatingItem<T> 
  {
   public string ClassName { get; set; }
   public T Model { get; set; }
  }
  public static IEnumerable<AlternatingItem<T>> Alternating<T>(this IEnumerable<T> model, string oddString, string evenString) 
  {
   int i = 0;
   var query = from x in model
      let c = i++ % 2 == 0 ? oddString : evenString
      select new AlternatingItem<T>() { ClassName = c, Model = x };
   return query;
  }