【问题标题】:ASP.net MVC2 Accessing two tables from a partial viewASP.net MVC2 从部分视图访问两个表
【发布时间】:2011-06-17 09:21:57
【问题描述】:

我正在寻找一些关于从一个局部视图访问两个数据库表的最佳方法的建议。

我有一个包含两个对象列表的视图模型,客户和客户站点,

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>

然后我在插入局部视图的主视图中有一个 for each 循环

<% 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

你能就我哪里出错提供任何建议吗?

非常感谢

利亚姆

【问题讨论】:

    标签: asp.net-mvc-2 list viewmodel


    【解决方案1】:

    问题是您没有使用视图模型。您刚刚定义了一些 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 元素呈现。它应该位于~/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) %>
    

    【讨论】:

    • @Darin Dimitrov,您好,感谢您的回复,我已按照您的指示进行操作,但仍然无法正常工作,如果您能给我更多建议,我将不胜感激。
    • @liam,请仔细阅读我的帖子。 CustomerSitesListViewModel.ascx 被强类型化为CustomerSitesListViewModel。在那里你可以访问它的属性。 &lt;%= Html.DisplayFor(x =&gt; x.Customers) %&gt; 位在 Index.aspx 视图内。
    • @Darin Dimitrov,谢谢我确实将它强烈键入到视图模型中,我现在可以正常工作但我必须添加 public SiteViewModel Sites { get;放; } 到 CustomerSitesListViewModel 并删除 Ienumerable 语法以访问两个对象
    • @Darin Dimitrov,现在我面临着如何在视图内的每个循环中渲染模板。
    • @Darin Dimitrov,当使用模板时,我是否只需要视图中的这一行 x.Customers) %>?因为属性是在模板中定义的。
    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 2011-06-09
    相关资源
    最近更新 更多