Подтвердить что ты не робот

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.

4b9b3361

Ответ 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>
<% } %>