Как я могу создать горизонтальную таблицу в одном цикле foreach в MVC?

Есть ли способ в 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>

Где модель IEnumerable<SomeObject>:

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

Это выведет таблицу следующим образом:

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

Я знаю, что, вероятно, мог бы использовать метод расширения для записи каждой строки, но возможно ли построить все строки, используя одну итерацию по модели?

Это продолжение этого вопроса поскольку я недоволен принятым ответом и не могу поверить, что предложил лучшее решение.


person djdd87    schedule 10.06.2010    source источник
comment
Насколько я знаю, это невозможно в одном цикле с заданным условием. Хороший вопрос, хотя :)   -  person Salil    schedule 10.06.2010
comment
Рассматривали ли вы возможность использования другой конструкции помимо таблицы? В данном случае для меня это не имеет смысла. За исключением IE6 и, возможно, 7, в качестве альтернативы стоит рассмотреть CSS display: table-cell/table-row. Так что никаких таблиц в таблицах :)   -  person Ahmad    schedule 10.06.2010


Ответы (3)


Если вы не ограничены использованием чистых таблиц, то это сработает для вас.

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

person Syd    schedule 10.06.2010
comment
Правомерно ли помещать заголовок таблицы в строку таблицы? Во всяком случае, можно было бы просто установить th на td в любом случае. Довольно хороший пример. В любом случае должно быть лучше, чем таблицы внутри таблиц! - person djdd87; 11.06.2010
comment
@GeneticTypeTea, это определенно работает. Протестировано как на IE8, так и на Firefox. Некоторые преимущества по сравнению с таблицей внутри таблиц: 1) меньшая пропускная способность. 2) легче стилизовать с помощью css. - person Syd; 12.06.2010

Проверьте следующий коврик, это поможет вам

<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 :)
person Salil    schedule 10.06.2010
comment
Хех, умничка. Мне это нравится, но я чувствую себя грязным из-за того, что мне это нравится. Я думаю, что предпочел бы свой ответ табличному решению, но разумному мышлению! - person djdd87; 10.06.2010
comment
@GenericTypeTea :- да! Я согласен с тобой, это грязно. я также не возражаю против 2 циклов над таблицей в табличном решении. Но это всего лишь 4 записи. Ваше здоровье - person Salil; 10.06.2010

Тема очень старая, но...

Я использовал следующее (но искал лучший подход, когда столкнулся с этим вопросом)

Создайте блок кода, который перебирает объекты и создает HTML для каждой строки в переменной, а затем выводит переменную.

Плюс в том, что вы зацикливаетесь только один раз и у вас нет вложенных таблиц (поэтому вещи с большей вероятностью выстраиваются в очередь), но минус — это манипуляции со строками html.

Вероятно, следует использовать stringbuilder, а не строку, но принцип тот же.

 @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>
person LawrenceF    schedule 15.01.2015