如何在ASP.NET MVC中创建4列 - 如何使我当前的代码更少

时间:2008-11-13 17:25:19

标签: asp.net asp.net-mvc

我有以下代码,我正在尝试获得一个包含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++;
  } %>                    

它有效,但很糟糕。是否有内置于框架或我可以使用的扩展方法?我想我可以自己动手,但想到那里必须有东西。

5 个答案:

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

您可以重复使用具有不同列数的相同功能