Полоса строк таблицы в 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;
}