MVC3 Показать информацию из более чем 1 объекта в 1 представлении - PullRequest
1 голос
/ 24 марта 2011

Для моего управляющего приложения в моей папке с моделями есть файл dbml с сущностями (например, лицо, компания, адрес, контакт, ...)

С помощью mvc я могу пока обрабатывать все операции CRUD, но только с 1 объекта. Теперь я хочу показать в 1 виде информацию о лице лица, а также соответствующую информацию о контакте и адресе лица. Сущности уже связаны с правильными отношениями.

Как я могу сделать это эффективно?

1 Ответ

6 голосов
/ 24 марта 2011

Вам необходимо создать ViewModel, который будет использоваться для хранения информации от каждой сущности, которая вам нужна в вашем фактическом представлении.

Например, у меня есть контроллер PublicationsController, который будет создавать страницу каталога в моей сети.приложение.Один ActionResult должен предоставить ViewModel с именем PublicationsListViewModel для моего View.

PublicationsListViewModel:

public class PublicationsListViewModel
{
    public IList<Publication> Publications { get; set; }

    public PagingInfo PagingInfo { get; set; }

    public String CurrentCategory { get; set; }

    public Dictionary<String, String> SelectedItems { get; set; }
}

Как вы можете видеть, PublicationsListViewModel - это просто контейнер для каждой сущности, который необходимо передать в мое представление.

Мой PublicationsController выглядит следующим образом:

Контроллер:

public ActionResult List(Cart cart, string category, int page = 1)
{
    Dictionary<String, String> selectedItems = new Dictionary<String, String>();

    foreach (var line in cart.Lines)
    {
        selectedItems.Add(line.Publication.PDFID.ToString(), line.Quantity.ToString());
    }

    foreach (var line in cart.Lines)
    {
        ViewData.Add(line.Publication.PDFID.ToString(), line.Quantity.ToString());
    }

    var publicationsToShow = (category == null)
                    ? publicationsRepository.Publications
                    : publicationsRepository.Publications.Where(x => x.Category.Equals(category, StringComparison.CurrentCultureIgnoreCase));

    var viewModel = new PublicationsListViewModel
    {
        Publications = publicationsToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
        PagingInfo = new PagingInfo
        {
            CurrentPage = page,
            ItemsPerPage = PageSize,
            TotalItems = publicationsToShow.Count()
        },
        CurrentCategory = category,
        SelectedItems = selectedItems
    };

    return View(viewModel); // Passed to view as ViewData.Model (or simply Model)
}

И мой вид выглядит следующим образом

Вид:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<myNameSpace.WebUI.Models.PublicationsListViewModel>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Publications : <%: Model.CurrentCategory ?? "All Publications" %>
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% 
    foreach (var publication in Model.Publications)
    { 
       Html.RenderPartial("PublicationSummary", publication, ViewData); 
    } 
    %>
    <div class="pager">
        <%: Html.PageLinks(Model.PagingInfo, x => Url.Action("List", new { page = x, category = Model.CurrentCategory }))%>
    </div>
</asp:Content>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...