我有以下代码,我正在尝试获得一个包含4列的表。如果我用完了列,请创建一个新行并再创建4个coumns。冲洗。泡沫。重复。
<tbody>
<%
int i = 0;
foreach (ItmXtnMultimedia multimedia in ViewData.Model.ItmXtnMultimedia) {
if (i%4 == 0 && i== 0)
{
%><tr><%
}
if (i%4 == 0 && i != 0)
{
%></tr><tr><%
}
%>
<td><%= multimedia.ImgTag100 %></td>
<%
i++;
} %>
它有效,但很糟糕。是否有内置于框架或我可以使用的扩展方法?我想我可以自己动手,但想到那里必须有东西。
答案 0 :(得分:2)
这是创建扩展方法的好地方。这是一些几乎可编译的C#伪代码:
public static void IDunnoWhatToCallThis<T>(
this HtmlHelper me,
T[] items,
int columns,
Action headerTemplate,
Action<T> itemTemplate,
Action newRowTemplate,
Action footerTemplate )
{
headerTemplate();
for(int i = 0;i < items.Length; i++)
{
if(i != 0 && i%columns == 0)
newRowTemplate();
itemTemplate(items[i]);
}
footerTemplate();
}
以下是一个使用示例:
<% Html.IDunnoWhatToCallThis(
ViewData.Model.ItmXtnMultimedia,
4,
() => %><table><tr><%,
(item) => %><td><%= item.ImgTag100 %></td><%,
() => %></tr><tr><%,
() => %></tr></table><%);%>
我喜欢这样的帮手,混合内联代码,lambdas和标记。它就像看魔术一样。
答案 1 :(得分:1)
实际上,我把冷杉从环中弹出......(仍然闻到了味道)
<tbody>
<tr>
<%
int i = 0;
foreach (ItmXtnMultimedia multimedia in ViewData.Model.ItmXtnMultimedia) {
if (i%4 == 0)
{
%></tr><tr><%
}
%>
<td><%= multimedia.ImgTag100 %></td>
<%
i++;
} %>
</tbody>
答案 2 :(得分:0)
你应该替换第二个if if else if ..除此之外,没关系。
foreach (ItmXtnMultimedia multimedia in ViewData.Model.ItmXtnMultimedia)
{
if (i%4 == 0 && i== 0)
{
%><tr><%
}
else if (i%4 == 0 && i != 0)
{
%></tr><tr><%
}
%><td><%= multimedia.ImgTag100 %></td><%
i++;
}%>
答案 3 :(得分:0)
我假设ViewData.Model.ItmXtnMultimedia是某种类型的列表:
<tbody>
<%
for (int i = 0; i < ViewData.Model.ItmXtnMultimedia.Count; i++ )
{
%><tr><%
for (int j = 0; i < 4; j++)
{
if (i < ViewData.Model.ItmXtnMultimedia.Count)
{
%><td><%= ViewData.Model.ItmXtnMultimedia[i].ImgTag100 %> %></td><%
}
else
{
%><td></td><%
}
}
%></tr><%
}
%>
</tbody>
仍然是一堆乱七八糟的代码,但可能更具可读性?
答案 4 :(得分:-1)
一个小重构怎么样?
<%
foreach (ItmXtnMultimedia multimedia in ViewData.Model.ItmXtnMultimedia) {
manageColumnsForMe( 4 )
%><td><%= multimedia.ImgTag100 %></td><%
}
%>
并使用静态变量将其他代码放入函数中以存储i
您可以重复使用具有不同列数的相同功能