Я согласен с тем, что сказали все остальные (что вам действительно следует просто использовать таблицу) - однако я постараюсь найти решение и вашей проблемы.
Я не думаю, что есть элегантный способ преодолеть проблему «цикл более одного раза», но по крайней мере мы можем немного упростить добавление новых столбцов в список:
var myList = (List<Person>)ViewData.Model;
var myColumns = new Dictionary<string, List<string>>();
myColumns.Add("Name", new List<string>());
myColumns.Add("Email", new List<string>());
myColumns.Add("Phone", new List<string>());
foreach(var person in myList){
myColumns["Name"].Add(Html.Encode(person.Name));
myColumns["Email"].Add(Html.Encode(person.Email));
myColumns["Phone"].Add(Html.Encode(person.Phone));
}
Тогда теперь вы можете сделать это:
<% foreach(var column in myColumns){ %>
<div class="column">
<div class="row"><%= column.Key %></div>
<% foreach (string value in column.Value) {%>
<div class="row"><%= value %></div>
<%} %>
</div>
<% } %>
Это все еще низкая производительность по сравнению с использованием -tag, и на самом деле я не понимаю, почему вы хотели бы избежать этого в этом сценарии.