我正在尝试将响应式设计应用于asp.net mvc 4应用程序。我想循环模型并每行渲染3个项目。每行应以div包裹。结果应如下所示:
...
为此,我尝试使用三元运算符:
@{ var i = 0; }
@foreach (var item in Model)
{
@Html.Raw(i == 0 ? Html.Encode("") :"")
//Responsive Content comes here
@Html.Raw(i == 2 ? Html.Encode("") :"")
@(i<3 ? i++ : i=0)
}
现在我有两个问题:
三元运算符应呈现的HTML标记为纯文本。我尝试了@Html.Raw和@Html.Encode与字符串的不同组合,但是对我没有用
似乎最后一个三元运算符呈现了变量i的当前值。我该如何预防?
附加信息/代码说明
逻辑已经可以正常工作:
i变量是计数变量。
If i = 0我首先渲染包装器的开始标签,然后渲染当前的model.item
If i = 1我只渲染当前的model.item
If i = 2我首先渲染当前的model.item,而不是结束标记
谢谢
更新
MajoB和Chris Pratt的方法基本上都起作用。由于MajoB的解决方案更加详细,因此我选择了该解决方案。
但是,我必须进行一些修改才能使其正常工作:
在控制器上,我必须确保返回的是IList,而不是IEnumberable
public ActionResult Index()
{
return View(db.leModel.ToList());
}
在视图上,我必须更改签名(例如1.,使用IList而不是IEnumerable)
@model IList
剃刀代码上的各种修改(否则将抛出异常)
最终代码:
@for (var i = 0; i < Model.Count; i++)
{
// the lambda expression modelItem => item.leProperty did not work for some reason. So I had to replace the item with Model[i], which means, the following line is not neccessary
{ var item = Model[i]; }
@Html.DisplayFor(modelItem => Model[i].leProperty)
if ((i + 1) % 3 == 0 || i == (Model.Count - 1))
{
@:
if (Model.Count + 1 - i >= 3)
{
@:
}
}
}
感谢大伙们 :)
@(stuff)告诉Razor打印输出。 尝试@{stuff}代替:-)
这是处理此问题的常用方法:
@for (var i = 0; i < Model.Count; i++)
{
@if ((i + 1) % 3 == 0)
{
@:
}
}
每隔第三个项目,包装div就会关闭并再次打开。 @:阻止Razor尝试解析此行,因此它不会引发错误的语法错误。
没有包装div的解决方案:
@for(var i = 0; i < Model.Count; i++)
{
@{ var item = Model[i]; }
@if((i+1) % 3 == 0)
{
}
}
包装器解决方案:
@for(var i = 0; i < Model.Count; i++)
{
@{ var item = Model[i]; }
@if((i+1) % 3 == 0 || i == (Model.Count-1)) // in case you have for example 7 items in your list
{
@:
@if (i != Model.Count-1)
{
@:
}
}
}
由于我的模型是IEnumerable,因此出现异常"无法将索引应用于类型为... ienumerable的表达式",该如何解决呢?
您可以更改模型以列出Model.ToList()或使用问题中的foreach方法。
为了使其能够正常工作,必须进行一些修改。 我用我完成的任务来更新我的问题