foreach или Repeater - что лучше?

Я создаю веб-сайт в ASP.Net, используя MVC, и мне нужно перечислить набор результатов. Оба следующих варианта работают так, как я хочу, но мне интересно, что быстрее, чище и/или лучше, или другой вариант был бы более подходящим?

Примечание. ViewData.Model относится к типу IEnumerable<Thing>, и мне нужно отобразить больше атрибутов, чем Name — для этого примера я обрезал код.


<% foreach (var thing in ViewData.Model)
   { %>
   <p><%= thing.Name %></p>
<% }; %>

<% rptThings.DataSource = ViewData.Model;
   rptThings.DataBind(); %>
<asp:Repeater ID="rptThings" runat="server">
    <ItemTemplate>
    <p><%# DataBinder.Eval(Container.DataItem, "Name") %></p>
    </ItemTemplate>
</asp:Repeater>


person Emma    schedule 07.12.2008    source источник


Ответы (5)


foreach однозначно быстрее, если специально что-то не напортачить. Repeater, конечно, чище и более четко разделяет пользовательский интерфейс и логику. Иногда вам нужно больше условий (кроме разного вида четных и нечетных строк), чтобы правильно отображать ваши вещи, что делает foreach единственным выбором.

Лично я предпочитаю Repeater для обычных ситуаций и foreach для более сложных.

РЕДАКТИРОВАТЬ: я говорил о простом ASP.NET с WebControls. Я согласен, что для MVC и даже страниц, которые в основном генерируются кодом, foreach проще и чище.

person mmx    schedule 07.12.2008

foreach — это путь для ASP.NET MVC. Почему? я лично избегаю любых устаревших элементов управления asp:xxx .. потому что они могут иметь раздувание, которое существует с моделью веб-форм. Во-вторых, как насчет всех event delegates, которые вам нужно подключить? вы начинаете смешивать и сопоставлять архитектуры, IMO, так что это может серьезно привести к настоящему спагетти-коду с сумасшедшими проблемами обслуживания и поддержки. (IMO: DataBinder.Eval == очень злой :( :( :( )

Единственный элемент управления asp:xxx, который я использую, это mastpage / content control (потому что ему нет альтернативы).

Наконец, выполнение foreach в asp.net mvc НЕ является спагетти-кодом, как считают многие. Я знаю, что знал, когда впервые увидел начальную демонстрацию mvc. Во всяком случае, это на самом деле делает пользовательский интерфейс намного чище, чем раньше, imo ... гораздо более удобным в сопровождении. ИМО, спагетти-код - это когда у вас много <% .. %> бизнес-логики и логики пользовательского интерфейса и (затычка) доступа к БД. Помните, это то, что делали пипсы на диком западе asp.net classic :P

Резюме

Придерживайтесь foreach и избегайте использования каких-либо элементов управления веб-формами — это просто, очень эффективно и вполне реально.

person Pure.Krome    schedule 07.12.2008
comment
The only asp:xxx control i use is the mastpage / content control(because there are no alternatives to it). - стоп, что?! Что не так с вложением страниц общего макета? Я делаю это в своем проекте, и он работает так, как ожидалось! - person iamserious; 14.09.2011
comment
@iamserious - какую версию ASP.NET MVC вы используете? - person Pure.Krome; 15.09.2011
comment
МВК 3! На самом деле, я никогда не использовал другие фреймворки mvc, так что извините, если вы не смогли сделать это в предыдущих версиях! - person iamserious; 15.09.2011
comment
АХ :) Проверьте, когда я ответил на этот пост. было некоторое время назад, MVC1. Теперь у нас есть регионы в Razor, что означает, что мы можем, наконец, отказаться от этого ASP:SMELL crap. О, и нет ничего плохого во вложенных общих страницах макета ... никогда не предполагалось, что это так. Просто пожаловался, что (тогда) единственным элементом управления asp: YUCK, который нам все еще приходилось использовать, были элементы управления masterpage / content ... потому что Razor не было рядом. - person Pure.Krome; 16.09.2011
comment
Да! Я должен был видеть дату публикации, моя ошибка, извиняюсь! Похоже, вы очень презираете веб-формы asp! - person iamserious; 16.09.2011
comment
Да, спасибо ‹вставьте любимое божество здесь› за Razor / MVC :) :) :) :) :) :) :) - person Pure.Krome; 16.09.2011

Я использую повторитель метода расширения от Фила Хаака. Лучшее обоих миров. http://haacked.com/archive/2008/05/03/code-based-repeater-for-asp.net-mvc.aspx

person Craig    schedule 07.12.2008
comment
Разве это не будет быстрее? ‹% int я = 0; foreach (var вещь в ViewData.Model) { %› ‹p class=row‹%= i % 2 %››‹%= вещь.Имя %›‹/p› ‹% i++; }; %› для классов .row0 и .row1 Это может быть глупо — просто выбросить это туда. - person Emma; 07.12.2008
comment
@Emma: конечно, вы не ЭММА, что Бон Айвер поет о? - person iamserious; 14.09.2011

<p each="var item in ViewData.Model">${item.Name}</p>

Ммм, вкусная Spark.

person Brad Wilson    schedule 07.12.2008
comment
Чтобы добавить к ответу Брэда, Spark — это альтернативная структура шаблонов MVC, похожая на Razor, но с другим синтаксисом. Я большой поклонник Spark, но немногие разработчики знакомы с ним. - person dthrasher; 14.06.2012

Вот другой вариант. Я сам этим не пользовался, но выглядит интересно.

person Tim Scott    schedule 07.12.2008