如何在 Razor mvc5 中每第 3 列创建一行?
How can I create a row for every 3rd column in Razor mvc5?
我目前正在尝试使用剃刀为每个第 3 列添加一个新行。但是,在当前代码中,只有前三列被换行,其余的被跳过。我一直在四处寻找修复方法,但 none 似乎适用于我的代码。有人对此有解决方案吗?
@model IEnumerable<Byporten.createpost>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_LayoutClient.cshtml";
}
<div class="container">
@{
var itemCount = 0;
}
@while (itemCount < 3)
{
foreach (var item in Model.Reverse().Take(9))
{
if(itemCount == 0 )
{
@:<div class="row">
}
<div class="col-lg-4 col-md-6 col-sm-6">
<div class="image-section">
<img src="~/images/uploads/@Html.DisplayFor(modelItem => item.ImageURL)"/>
</div>
<div class="title-section">
<h5><span class="fa fa-pencil"></span> @Html.DisplayFor(modelItem => item.Title)</h5>
@Html.ActionLink("Les mer", "viewArticle", new { id = item.Id })
</div>
</div>
itemCount++;
if ((itemCount % 3) == 0)
{
@:</div>
}
}
}
@{itemCount = 0;}
</div>
这将导致标记无效,因为 itemCount == 0
只会为真一次。将 if (itemCount == 0)
替换为 if (itemCount % 3 == 0 || itemCount % 3 == 3)
.
我还会摆脱 while
循环和底部的 itemCount
重置。
使用 Html.Raw()
方法避免条件结束标记的编译问题,使用临时变量 insertRow
避免在行条件中重复:
<div class="container">
@{
var itemCount = 0;
}
@{
foreach (var item in Model.Reverse().Take(9))
{
var insertRow = itemCount % 3 == 0;
if(insertRow)
{
@Html.Raw("<div class="row">")
}
<div class="col-lg-4 col-md-6 col-sm-6">
<div class="image-section">
<img src="~/images/uploads/@Html.DisplayFor(modelItem => item.ImageURL)"/>
</div>
<div class="title-section">
<h5><span class="fa fa-pencil"></span> @Html.DisplayFor(modelItem => item.Title)</h5>
@Html.ActionLink("Les mer", "viewArticle", new { id = item.Id })
</div>
</div>
if (insertRow)
{
@Html.Raw("</div>")
}
itemCount++;
}
}
</div>
而且 while (itemCount < 3)
循环看起来很奇怪,对于您的任务来说是不必要的。
所以,我知道我来晚了一点,并且有一个公认的答案,但是,我想添加我的演绎版,因为它不需要重复的 if
语句,也不需要代码编译曲线。
我的方法是根据您在创建新行之前希望拥有的列数使用内部 for 循环:
<table>
<thead>
<tr>
<td><b>My List Data:</b></td>
</tr>
</thead>
<tbody>
@{
var items = Model.MyList;
const int colCount = 2;
}
@for (var i = 0; i < items.Count(); i += colCount)
{
<tr>
@for (var c = 0; c < colCount && i + c < items.Count(); c++)
{
<td>@(items[i + c].Display):</td>
}
</tr>
}
</tbody>
</table>
前提是确定你的列数是多少,也就是上面用const int colCount =2;
显示
然后,使用 for
循环在您的列表上循环,但不是像传统那样递增 1,而是递增 colCount
值。
然后,有你的行标签。这意味着每 n+colCount 个项目将创建一行。
在该行标记内,使用另一个递增 1 的 for 循环,直到您到达 colCount 或您的父迭代器加上您的 colCount 迭代器等于或超过列表中的项目总数。
在该 for 循环中,只需创建一个位于 i
(外部迭代器)+ c
(colCount)迭代器索引处的单元格。
这为您提供了一个很好的从左到右、从上到下的 table 平面列表结构,没有额外的 if 语句和编译警告。
None 其中对我有用,但以下对我有用:
@foreach (var item in Model.Items)
{
var itemCount = 0;
foreach (var listItem in ((ListViewModel)item).ListItemViewModel.Items)
{
if (itemCount == 0)
{
@:<div class="row">
}
<div class="col-md-4">
<a href="#" data-sf-role="toggleLink" class="organogram-title"><span class="organogram-outter-ring"></span>@listItem.Fields.Title</a>
<div style="display:none;" class="sf-list-content">
@Html.Raw(listItem.Fields.Content)
</div>
<div class="organogram-outter-ring"></div>
</div>
if (itemCount == 2)
{
itemCount = 0;
@:</div>
}
else
{
itemCount++;
}
}
}
我目前正在尝试使用剃刀为每个第 3 列添加一个新行。但是,在当前代码中,只有前三列被换行,其余的被跳过。我一直在四处寻找修复方法,但 none 似乎适用于我的代码。有人对此有解决方案吗?
@model IEnumerable<Byporten.createpost>
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_LayoutClient.cshtml";
}
<div class="container">
@{
var itemCount = 0;
}
@while (itemCount < 3)
{
foreach (var item in Model.Reverse().Take(9))
{
if(itemCount == 0 )
{
@:<div class="row">
}
<div class="col-lg-4 col-md-6 col-sm-6">
<div class="image-section">
<img src="~/images/uploads/@Html.DisplayFor(modelItem => item.ImageURL)"/>
</div>
<div class="title-section">
<h5><span class="fa fa-pencil"></span> @Html.DisplayFor(modelItem => item.Title)</h5>
@Html.ActionLink("Les mer", "viewArticle", new { id = item.Id })
</div>
</div>
itemCount++;
if ((itemCount % 3) == 0)
{
@:</div>
}
}
}
@{itemCount = 0;}
</div>
这将导致标记无效,因为 itemCount == 0
只会为真一次。将 if (itemCount == 0)
替换为 if (itemCount % 3 == 0 || itemCount % 3 == 3)
.
我还会摆脱 while
循环和底部的 itemCount
重置。
使用 Html.Raw()
方法避免条件结束标记的编译问题,使用临时变量 insertRow
避免在行条件中重复:
<div class="container">
@{
var itemCount = 0;
}
@{
foreach (var item in Model.Reverse().Take(9))
{
var insertRow = itemCount % 3 == 0;
if(insertRow)
{
@Html.Raw("<div class="row">")
}
<div class="col-lg-4 col-md-6 col-sm-6">
<div class="image-section">
<img src="~/images/uploads/@Html.DisplayFor(modelItem => item.ImageURL)"/>
</div>
<div class="title-section">
<h5><span class="fa fa-pencil"></span> @Html.DisplayFor(modelItem => item.Title)</h5>
@Html.ActionLink("Les mer", "viewArticle", new { id = item.Id })
</div>
</div>
if (insertRow)
{
@Html.Raw("</div>")
}
itemCount++;
}
}
</div>
而且 while (itemCount < 3)
循环看起来很奇怪,对于您的任务来说是不必要的。
所以,我知道我来晚了一点,并且有一个公认的答案,但是,我想添加我的演绎版,因为它不需要重复的 if
语句,也不需要代码编译曲线。
我的方法是根据您在创建新行之前希望拥有的列数使用内部 for 循环:
<table>
<thead>
<tr>
<td><b>My List Data:</b></td>
</tr>
</thead>
<tbody>
@{
var items = Model.MyList;
const int colCount = 2;
}
@for (var i = 0; i < items.Count(); i += colCount)
{
<tr>
@for (var c = 0; c < colCount && i + c < items.Count(); c++)
{
<td>@(items[i + c].Display):</td>
}
</tr>
}
</tbody>
</table>
前提是确定你的列数是多少,也就是上面用const int colCount =2;
然后,使用 for
循环在您的列表上循环,但不是像传统那样递增 1,而是递增 colCount
值。
然后,有你的行标签。这意味着每 n+colCount 个项目将创建一行。
在该行标记内,使用另一个递增 1 的 for 循环,直到您到达 colCount 或您的父迭代器加上您的 colCount 迭代器等于或超过列表中的项目总数。
在该 for 循环中,只需创建一个位于 i
(外部迭代器)+ c
(colCount)迭代器索引处的单元格。
这为您提供了一个很好的从左到右、从上到下的 table 平面列表结构,没有额外的 if 语句和编译警告。
None 其中对我有用,但以下对我有用:
@foreach (var item in Model.Items)
{
var itemCount = 0;
foreach (var listItem in ((ListViewModel)item).ListItemViewModel.Items)
{
if (itemCount == 0)
{
@:<div class="row">
}
<div class="col-md-4">
<a href="#" data-sf-role="toggleLink" class="organogram-title"><span class="organogram-outter-ring"></span>@listItem.Fields.Title</a>
<div style="display:none;" class="sf-list-content">
@Html.Raw(listItem.Fields.Content)
</div>
<div class="organogram-outter-ring"></div>
</div>
if (itemCount == 2)
{
itemCount = 0;
@:</div>
}
else
{
itemCount++;
}
}
}