ASP.net MVC2 Доступ к двум таблицам из частичного представления - PullRequest
0 голосов
/ 17 июня 2011

Мне нужен совет о том, как лучше всего получить доступ к двум таблицам базы данных из одного частичного представления.

У меня есть модель представления, которая включает два списка объектов, клиентов и сайтов клиентов,

public class CustomerSitesListViewModel
{
    public IList<CustomerSite> CustomerSites { get; set; }
    public PagingInfo PagingInfo { get; set; }
    public IList<Customer> customers { get; set; }
}

У меня есть частичное представление, которое наследует модель представления

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CustomerDatabase.WebUI.Models.CustomerSitesListViewModel>" %>
<ul id="list-of-sites">
<li><%: Model.AddressLine1 %></li>
<li><%: Model.AddressLine2%></li>
<li><%: Model.AddressLine3%></li>

Тогда у меня есть для каждого цикла в главном представлении, которое вставляет частичное представление

<% foreach (var customerSite in Model.CustomerSites) { %>
<% %>
<% Html.RenderPartial("CustomerSiteSummary", customerSite); %>
<%} %>

Теперь в частичном представлении идентификатора хотелось бы иметь возможность доступа к свойствам для обоих объектов, как для клиента, так и для сайта клиента, я думал, что смогу получить к ним доступ таким образом

<%Html.DisplayFor(modelItem => Model.customers.CustomerName)%>
<%Html.DisplayFor(modelItem => Model.CustomerSite.AddressLine1)%>

Однако самое дальнее, что я могу получить, это

Model.customers

Есть ли в любом случае доступ к свойствам клиентов, т. Е. Клиентам. Имя клиента,

Это один из аспектов MVC, который я действительно не понимаю, я застрял с этим уже более недели, буду признателен за любой совет, который кто-либо может предложить.

Привет

Ли

Обновление =======

Я добавил следующие модели просмотра

Модель просмотра клиента

public class CustomerViewModel
{
    public int Id { get; set; }
    public string CustomerName { get; set; }
    public string PrimaryContactName { get; set; }
    public string PrimaryContactNo { get; set; }
    public SiteViewModel Site { get; set; }

}

Модель просмотра сайта

public class SiteViewModel
{
    public int Id { get; set; }
    public int CustomerId { get; set; }
    public string AddressLine1 { get; set; }
    public string AddressLine2 { get; set; }
}

Мастер модель просмотра

public class CustomerSitesListViewModel
{
    public IList<CustomerSite> CustomerSites { get; set; }
    public PagingInfo PagingInfo { get; set; }
    public IList<Customer> customers { get; set; }
    public IEnumerable<CustomerViewModel> Customers { get; set; }
}

Я строго ввел представление в CustomerSitesListViewModel

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

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>Customer Sites</h2>
<%= Html.DisplayFor(x => x.Customers) %>
<div class="pager">
<%: Html.PageLinks(Model.PagingInfo, x => Url.Action("List", "CustomerSites", new {   page = x }))%>

Я добавил шаблон в Views Shared / DisplayTemplates

CustomerSitesListViewModel.ascx

<%= Html.DisplayFor(x => x.Customers.) %>

Это по-прежнему не позволяет мне получить доступ к свойствам, я могу получить доступ как к объектам клиентов, так и к объектам клиентов, но не к свойствам, поэтому дальше всего меня отпустят x.Customers или x.CustomerSites

Это мой контроллер, который возвращает два списка клиентов и сайтов

 public ViewResult List([DefaultValue(1)] int page)
    {
        var customerSitesToShow = customerSiteRepository.CustomerSites;
        var customersToShow = customerRepository.Customers;
        var viewModel = new CustomerSitesListViewModel
        {

            CustomerSites = customerSitesToShow.Skip((page - 1) *   PageSize).Take(PageSize).ToList(),
            customers = customersToShow.Skip((page - 1) * PageSize).Take(PageSize).ToList(),
            PagingInfo = new PagingInfo
            {
                CurrentPage = page,
                ItemsPerPage = PageSize,
                TotalItems = customerSitesToShow.Count()
            }
        };

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

Можете ли вы дать совет, где я иду не так?

Большое спасибо

Ли

1 Ответ

0 голосов
/ 18 июня 2011

Проблема в том, что вы не используете модели просмотра.Вы только что определили некоторый класс CustomerSitesListViewModel, в который вы добавили свои доменные модели, как свойства, которые не соответствуют требованиям данного конкретного представления.

Итак, первое, что нужно сделать, это определить модель чистого представления.Вы сказали, что вам необходимо получить доступ к частичным свойствам как для клиента, так и для сайта клиента.Таким образом, между ними должна быть некоторая связь.

Давайте начнем с определения этой модели вида:

public class SiteViewModel
{
    public string AddressLine1 { get; set; }
}

public class CustomerViewModel
{
    public string Name { get; set; }
    public SiteViewModel Site { get; set; }
}

и, наконец, модели основного вида:

public class CustomerSitesListViewModel
{
    public IEnumerable<CustomerViewModel> Customers { get; set; }
}

Теперь давайтеперейдите к контроллеру:

public ActionResult Index()
{
    // TODO: query repositories and map the domain objects 
    // they returned to the actual view model. Can't help much
    // here as I don't know how are your domain models and repositories
    // organized

    var viewModel = new CustomerSitesListViewModel
    {
        Customers = ...
    };
    return View(viewModel);
}

, а затем к главному виду, который будет строго набран на CustomerSitesListViewModel:

<%= Html.DisplayFor(x => x.Customers) %>

, и, наконец, нам нужно определить шаблон редактора, который будетбудет отображаться автоматически для элемента eqch коллекции Customers.Он должен быть расположен в ~/Views/Shared/DisplayTemplates/CustomerSitesListViewModel.ascx:

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<CustomerSitesListViewModel>" 
%>
<%= Html.DisplayFor(x => x.Name) %>
<%= Html.DisplayFor(x => x.Site.AddressLine1) %>
...