【问题标题】:How can I create a horizontal table in a single foreach loop in MVC?如何在 MVC 的单个 foreach 循环中创建水平表?
【发布时间】:2011-03-02 00:54:30
【问题描述】:

在 ASP.Net MVC 中有什么方法可以将以下代码压缩为单个 foreach 循环?

<table class="table">
    <tr>
        <td>
            Name
        </td>    
        <% 
        foreach (var item in Model) 
        {
         %>
            <td>
                <%= item.Name %>
            </td>
        <% 
        } 
        %>
    </tr>
    <tr>
        <td>
            Item
        </td>    
        <% 
        foreach (var item in Model) 
        {
         %>
            <td>
                <%= item.Company %>
            </td>
        <% 
        } 
        %>
    </tr>
</table>

model 是IEnumerable&lt;SomeObject&gt;:

public class SomeObject
{
   public virtual Name {get;set;}
   public virtual Company {get;set;}
}

这将输出如下表格:

Name     |    Bob    |     Sam    |    Bill   |     Steve    |
Company  |  Builder  |   Fireman  |     MS    |     Apple    |

我知道我可以使用扩展方法来写出每一行,但是是否可以使用模型上的单次迭代来构建所有行?

这是question 的后续内容,因为我对接受的答案不满意,不敢相信我提供了最佳解决方案。

【问题讨论】:

  • AFAIK 在给定条件的单个循环中是不可能的。不过问题很好:)
  • 您是否考虑过使用除表格之外的其他构造?在这种情况下,这对我来说没有意义。除了 IE6 和 7,CSS display: table-cell/table-row 可能值得研究作为替代。所以没有表中的表:)

标签: asp.net-mvc model-view-controller model foreach


【解决方案1】:

检查以下对您有帮助的垫子

<table class="table">
    <tr>
        <td>
            <table>
                <tr><td>Name</td></tr>
                <tr><td>Item</td></tr>
             <table>
        </td>    
        <% 
        foreach (var item in Model) 
        {
         %>
            <td>
                <table>
                  <tr><td><%= item.Name %></td></tr>
                  <tr><td><%= item.company %></td></tr>
                <table>
            </td>
        <% 
        } 
        %>
    </tr>
</table>

注意:-

No check though :)

【讨论】:

  • 嘿,聪明。我喜欢它,但我因为喜欢它而感到肮脏。我想我更喜欢我的答案而不是 table>in>table 解决方案,但聪明的想法!
  • @GenericTypeTea :- 是的!我同意你的看法,这很脏。我也不介意 table>in>table 解决方案上的 2 个循环。但这只是4记录。欢呼的
【解决方案2】:

如果您不限于使用纯表,那么这对您有用。

<table class="table"> 
    <tr> 
        <th> 
             Name<br/>
             Item<br/>
        </th>     
        <%  
        foreach (var item in Model)  
        { 
         %> 
            <td> 
                  <%= Html.Encode(item.Name) %><br/>
                  <%= Html.Encode(item.company) %><br/>
            </td> 
        <%  
        }  
        %> 
    </tr> 
</table> 

您绝对可以通过使用 span 和 css 样式来改善这一点。

【讨论】:

  • 将表头放在表行中是否合法?无论如何,无论如何,可能只是将 th 设置为 td 。一个很好的例子。无论如何必须比表中的表更好!
  • @GeneticTypeTea,它确实有效。在 IE8 和 Firefox 上测试。与“表中表”相比的一些优点是:1)带宽更少。 2) 更易于使用 css 进行样式设置。
【解决方案3】:

很老的线程,但是...

我使用了以下方法(但在遇到这个问题时正在寻找更好的方法)

创建一个循环遍历对象的代码块,并为变量中的每一行创建 HTML,然后输出变量。

优点是你只循环一次并且没有嵌套表(所以事情更有可能排成一行),但缺点是 html 的字符串操作。

应该可能使用stringbuilder而不是string,但原理是一样的。

 @code
        Dim tr1 As String = "<th>Name</th>"
        Dim tr2 As String = "<th>Company</th>"

        For Each thingy As object In Model

            tr1 += "<th>" & thingy.Name & "</th>"
            tr2 += "<th>" & thingy.Company & "</th>"

        Next



        End Code

        @<table class="table table-condensed">
            <tr>@Html.Raw(tr1)</tr>
            <tr>@Html.Raw(tr2)</tr>
         </table>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多