Let’s start with improving your code.
-
Improvement step 1:
@foreach(var myObj in Model.Select((model, index) => new { model, index })) { <div class="class@(myObj.index % 2 == 0 ? "1" : "2")"> @Html.Partial("_Foo", myObj.model) </div> }
-
Improvement Step 2 (using a custom HTML helper for the class):
@foreach(var myObj in Model.Select((model, index) => new { model, index })) { <div class="@Html.MyClass(myObj.index)"> @Html.Partial("_Foo", myObj.model) </div> }
where MyClass is defined like this:
public static string MyClass(this HtmlHelper html, int index) { return (index % 2 == 0) ? "class1" : "class2"; }
-
Improvement step 3 which is the state of the art (using Templated Razor Delegates):
@Model.List( @<div class="@item.MyClass"> @Html.Partial("_Foo", @item.Model) </div> )
where the
List
extension method looks like this:public class ModelHolder<T> { public T Model { get; set; } public string MyClass { get; set; } } public static class RazorExtensions { public static HelperResult List<T>( this IEnumerable<T> items, Func<ModelHolder<T>, HelperResult> template ) { return new HelperResult(writer => { foreach (var item in items.Select((model, index) => new { model, index })) { var myClass = item.index % 2 == 0 ? "class1" : "class2"; template(new ModelHolder<T> { Model = item.model, MyClass = myClass }).WriteTo(writer); } }); } }
I vote for improvement number 3 which is far better and more concise than the original foreach loop.