Mvc 3 эквивалентно функции <asp: repeatater>?
У меня есть сайт в Asp.Net, который я пытаюсь подключить к MVC 3, и я работал с MVC 2 раньше. Я наткнулся на следующую функцию asp
<div class="popup-holder">
<ul class="popups">
<asp:Repeater runat="server" ID="ourTeamRepeater" OnItemDataBound="ourTeamRepeater_ItemDataBound">
<ItemTemplate>
<asp:Panel ID="pnlTeamMember" runat="server">
<li id="TeamMember" runat="server" class="memberImage">
<asp:Image runat="server" ID="memberImg" />
</li>
<div class="popup">
<div class="img-holder">
<asp:Image runat="server" ID="memberImgBig" />
</div>
<div class="popup-text-t">
<div class="close">
close
</div>
</div>
<div class="popup-text">
</div>
<div class="popup-text-b">
</div>
<div class="holder">
<asp:Literal ID="memberDescription" runat="server" />
</div>
</div>
</asp:Panel>
</ItemTemplate>
</asp:Repeater>
</ul>
похоже, что это работает аналогично циклу for, но я не совсем уверен, как преобразовать его в архитектуру MVC 3.
Ответы
Ответ 1
Портирование существующего приложения WebForms в ASP.NET MVC - это не только слепо переводя строку за строкой на некоторый код просмотра WebForms, который у вас есть. Вы должны учитывать семантику целевой платформы. Например, преобразование этого asp:Repeater
в уродливый цикл foreach
вместо учета таких вещей, как модели просмотра, отображать шаблоны не очень хорошо.
Итак, в ASP.NET MVC вы начинаете с разработки моделей представления:
public class MemberViewModel
{
public int Id { get; set; }
public string Description { get; set; }
}
тогда вы создаете действие контроллера, которое заполняет эту модель представления:
public ActionResult Index()
{
IEnumerable<MemberViewModel> model = ...
return View(model);
}
тогда вы пишете строго типизированный вид, в котором вы вызываете шаблон отображения:
@model IEnumerable<MemberViewModel>
@Html.DisplayForModel()
а затем вы определяете шаблон отображения, который будет отображаться для каждого элемента коллекции (~/Views/Shared/DisplayTemplates/MemberViewModel.cshtml
):
@model MemberViewModel
<li id="TeamMember" class="memberImage">
<img src="Url.Action("ThumbnailImage", new { id = Model.Id })" alt=""/>
</li>
<div class="popup">
<div class="img-holder">
<img src="Url.Action("FullImage", new { id = Model.Id })" alt=""/>
</div>
<div class="popup-text-t">
<div class="close">
close
</div>
</div>
<div class="popup-text"></div>
<div class="popup-text-b"></div>
<div class="holder">
@Html.DisplayFor(x => x.Description)
</div>
</div>
Теперь вы заметите два дополнительных действия контроллера ThumbnailImage
и FullImage
, которые позволят нам получить изображения членов, заданных идентификатором элемента. Например:
public ActionResult ThumbnailImage(int id)
{
byte[] thumbnail = ...
return File(thumbnail, "image/jpeg");
}
Теперь это больше похоже на ASP.NET MVC. Как вы видите, это совершенно другой шаблон, чем классические WebForms.
Ответ 2
Вы совершенно правы, полагая, что MVC-эквивалент asp: Repeater -
<% foreach( var item in Model )
{ %>
<!-- Your HTML Markup -->
<% } %>
Ответ 3
Вы правы в том, что он похож на цикл for
. Простая реализация может выглядеть так:
<div class="popup-holder">
<ul class="popups">
<%foreach(var item in Model.Items) { %>
<div id="pnlTeamMember">
<img src="<%: item.MemberImageSrc %>" ID="memberImg" />
<div class="popup">
<div class="img-holder">
<img src="<%: item.MemberImgBigSrc %>" ID="memberImgBig" />
</div>
<div class="popup-text-t">
<div class="close">
close
</div>
</div>
<div class="popup-text">
</div>
<div class="popup-text-b">
</div>
<div class="holder">
<%: item.MemberDescription %>
</div>
</div>
</div>
<% } %>
</ul>
Вы заметите, что больше нет элементов управления с runat="server"
, и нет событий, связанных с обработчиками в коде. Вместо этого мы предполагаем, что контроллер заполнил объект Model
объектами, представляющими данные, которые нам нужно отобразить. Такова роль контроллера при использовании MVC.
Ответ 4
Повторитель - это всего лишь цикл, который обеспечивает привязку данных, чтобы вы могли получить доступ к элементам в коллекции, которые вы зацикливаете. Если вы посмотрите в методе ourTeamRepeater_ItemDataBound
, вы найдете код, который использует элементы базы данных, чтобы заполнить элементы в шаблоне элемента данными.
Обычно вы можете просто использовать цикл foreach
в MVC для объединения элементов. Пример:
<% foreach (var item in items) { %>
<div class="holder">
<%= item.Description %>
</div>
<% } %>