我正在寻找一些关于从一个局部视图访问两个数据库表的最佳方法的建议。
我有一个视图模型,其中包括两个对象列表,客户和客户站点,
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); %>
<%} %>
现在在局部视图中,id喜欢能够访问客户和客户站点这两个对象的属性,我想我可以像这样访问它们
<%Html.DisplayFor(modelItem => Model.customers.CustomerName)%>
<%Html.DisplayFor(modelItem => Model.CustomerSite.AddressLine1)%>
然而,我能得到的最远的是
Model.customers
无论如何都要访问客户属性,即customers.CustomerName,
这是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
您能就我出错的地方提供任何建议吗?
非常感谢
利安
答案 0 :(得分:0)
问题是您没有使用视图模型。您刚刚定义了一些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) %>
最后我们需要定义一个编辑器模板,该模板将自动呈现给Customers集合的eqch元素。它应位于~/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) %>