如何在ASP.NET MVC中跨4列-如何使我当前的代码不那么糟糕

如何在ASP.NET MVC中跨4列-如何使我当前的代码不那么糟糕,asp.net,asp.net-mvc,Asp.net,Asp.net Mvc,我有下面的代码,我试图得到一个4列的表。如果列用完了,创建一个新行,再创建4个列。冲洗泡沫。重复一遍 <tbody> <% int i = 0; foreach (ItmXtnMultimedia multimedia in ViewData.Model.ItmXtnMultimedia) { if (i%4 == 0 && i== 0) { %><tr><% } if (i%4 == 0 && i

我有下面的代码,我试图得到一个4列的表。如果列用完了,创建一个新行,再创建4个列。冲洗泡沫。重复一遍

<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++;
  } %>                    


这很有效,但很糟糕。框架中是否有内置的东西或我可以使用的扩展方法?我想我可以自己玩,但我想一定有什么东西在那里。

你应该用else if替换第二个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++;
}%>
foreach(视图数据中的ItmXtnMultimedia.Model.ItmXtnMultimedia)
{
如果(i%4==0&&i==0)
{
%>

事实上,我把冷杉从环中弹了出来…(但仍然有气味)


进行一点重构怎么样

<%
foreach (ItmXtnMultimedia multimedia in ViewData.Model.ItmXtnMultimedia) {
  manageColumnsForMe( 4 )
  %><td><%= multimedia.ImgTag100 %></td><%
  } 
%>

然后将另一个代码放入一个函数中,使用一个静态变量来存储i


您可以使用不同列数重复使用相同的函数

我假设ViewData.Model.itmxtn多媒体是某种类型的列表:

<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>

%>

代码仍然杂乱无章,但可能更具可读性?

这是创建扩展方法的好地方。下面是一些几乎可编译的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();
}
public static void idunnowhatcallthis(
这对我很有帮助,
T[]项,
int列,
行动负责人模板,
动作项模板,
操作newRowTemplate,
操作(模板)
{
头模板();
对于(int i=0;i
下面是一个正在使用的示例:

<% Html.IDunnoWhatToCallThis(
  ViewData.Model.ItmXtnMultimedia,
  4,
  () => %><table><tr><%,
  (item) => %><td><%= item.ImgTag100 %></td><%,
  () => %></tr><tr><%,
  () => %></tr></table><%);%>
%%>%%>%%>

我喜欢这样的助手,混合了内联代码、lambda和标记。这就像看魔术一样。

解析器杀死了我一半的第一条评论。我从循环中取出了第一个tr标记。
<% Html.IDunnoWhatToCallThis(
  ViewData.Model.ItmXtnMultimedia,
  4,
  () => %><table><tr><%,
  (item) => %><td><%= item.ImgTag100 %></td><%,
  () => %></tr><tr><%,
  () => %></tr></table><%);%>