问题描述
|
我正在尝试显示应该出于样式目的而切换类的项目列表。这个想法是创建一个foreach循环,该循环将遍历模型中的所有“ 0”。
我尝试了以下无效的代码(因为我做错了)
@{ 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代码(并且我确定Model中有对象)。
@{ 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(使用模板化剃刀代表):
@Model.List(
@<div class=\"@item.MyClass\">
@Html.Partial(\"_Foo\",@item.Model)
</div>
)
List
扩展方法如下所示:
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循环更好,更简洁。
, 您需要在行的开头加上格式不正确的标签并加上ѭ10前缀,以防止Razor尝试解析标签。
细节。
, 您可能会确定某些模型中有对象-但您的模型中没有:)
以下直接从您的示例代码派生的示例工作正常:
@{ int i = 2;
string[] list = new string[] {\"a\",\"b\",\"c\",\"d\"};
foreach(var myObj in list)
{
if (i % 2 == 0){
@:<div class=\"class1\">
}
else
{
@:<div class=\"class2\">
}
//Html.Partial(...);
@:</div>
i += 1;
}
}
, 您需要编写@Html.Partial(...)
才能将结果呈现到页面上。
调用Html.Partial
会返回带有局部视图的HelperResult
,但实际上并不会渲染它。