我试图显示一个应该切换类的项目列表,以便进行样式设置。这个想法是创建一个foreach循环,循环遍历Model中的所有myObj。
我尝试了以下代码不起作用(因为我做错了)
@{ int i = 2; foreach(var myObj in Model) { if (i % 2 == 0) { <div class="class1"> } else { <div class="class2"> } Html.Partial(...); </div> i += 1; } }
什么是正确的方式来完成这个?
更新
我也尝试了以下代码,虽然编译,但并不渲染任何HTML代码(我确定模型中有对象)。
@{ int i = 2; foreach(var myObj in Model) { if (i % 2 == 0) { @:<div class="class1"> } else { @:<div class="class2"> } Html.Partial(...); @:</div> i += 1; } }
<div class="class"> <div class="class2"> @if (string.IsNullOrEmpty(var)) { @var2 } else { @var } </div> <div class="class3"> @var3 </div> </div> <div class="class4"> <p>var4</p> <ul class="class5"> <li>element1</li> <li>element2</li> </ul> </div>
对不起,我不能发布实际的名称和变量。
解决方法
我们开始改进你的代码。
>改进步骤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> }
>改进步骤2(使用类的自定义HTML助手):
@foreach(var myObj in Model.Select((model,index })) { <div class="@Html.MyClass(myObj.index)"> @Html.Partial("_Foo",myObj.model) </div> }
MyClass定义如下:
public static string MyClass(this HtmlHelper html,int index) { return (index % 2 == 0) ? "class1" : "class2"; }
>改进步骤3是最先进的(使用Templated Razor Delegates):
@Model.List( @<div class="@item.MyClass"> @Html.Partial("_Foo",@item.Model) </div> )
列表扩展方法如下所示:
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 })) { var myClass = item.index % 2 == 0 ? "class1" : "class2"; template(new ModelHolder<T> { Model = item.model,MyClass = myClass }).WriteTo(writer); } }); } }
我投票改进3号,比原来的foreach循环更好,更简洁。