【问题标题】:ASP.net MVC.2 return multiple objects to strongly typed viewmodelASP.net MVC.2 将多个对象返回到强类型视图模型
【发布时间】:2026-02-08 00:30:01
【问题描述】:

我是 MVC 新手,我使用存储库模式尝试选择包含两个对象的数据以返回到强类型视图模型,

我有点不知道最好的方法是什么,

这两个表由一个客户 ID 字段相关,我设置了一个存储库接口,以及一个强类型化到包含客户属性和客户站点对象的视图模型的显示模板,我所需要的只是显示客户站点列表以及客户表中的相关客户名称。

在显示模板中我有以下内容

<%= Html.DisplayFor(x => x.Customers.CustomerName) %>
<%= Html.DisplayFor(x => x.Customers.Site.AddressLine1) %>

我有这个显示模板工作,但我的模型是空的。

我感到困惑的是如何在界面和存储库中定义这些数据,以及如何将数据返回到我的模型,以简单地返回我在界面中使用的客户列表

IQueryable<Customer> Customers { get; }

然后是一个简单的 LINQ 选择。

但由于此数据将包含客户和客户站点,我不确定如何在界面中定义它?

LINQ 连接也是将此数据返回到我的视图模型的合适方法吗?像

var Customers =

    from c in customers

    join cs in customerSites on c equals cs.CustomerId into ps

    from p in ps

    select new { Customer = c, cs.CustomerName };

更新=========

这是我在视图模型中使用的代码,它只输入到显示模板中,

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

它是如何使用两个对象填充存储库/控制器中的模型以显示在我正在努力解决的列表中。

【问题讨论】:

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


    【解决方案1】:

    您可能已经完成了以下一些步骤,所以如果您有请忽略..

    1 在您的解决方案中创建一个 ViewModel 文件夹。

    2 创建基础视图模型 .... 可能如下所示 ->

    public class BaseViewModel
        {
            public PageProperties PageProperties { get; set; }
            public User User { get; set; }
        }
    

    3 为您的控制器操作设置视图模型可能是这样 ->

    public class ProjectVM : BaseViewModel
        {
            public ProjectPoco project { get; set; }
    
        }
    

    4 在您的控制器中,从存储库中获取数据并将其传递给您的视图模型实例,如下所示 ->

    var contextVM = new ProjectVM();

            contextVM.project = ObjectExtensions.Convert<ProjectPoco>(tbl.Single(id));
            contextVM.PageProperties = new PageProperties
                                           {
                                               Heading = contextVM.project.Name,
                                               SubHeading = "Details for" +
    

    contextVM.project.Name }; 返回视图(contextVM);

    5 将您的视图模型设置为您的视图模型的模型 ->

    @模型 NerveCentre.ViewModels.ProjectVM

    6 使用您的视图模型将数据提取到您的视图中 ->

    @Model.project.Description

    通过视图模型将数据传递到您的视图的快速而粗略的描述。希望我没有错过任何东西。

    至于数据.. 看看您如何拥有模型 (Customers.Site.AddressLine1) 是否不仅可以将客户从您的查询传递到您的视图模型?

    所以你的视图模型可能看起来像..

        public class SomeViewModel: BaseViewModel
        {
            public List<Customer> Customers { get; set; }
    
        }
    

    如果您让我们知道您使用什么来访问数据,那么我们可能会在将数据从您的表格中取出并转换成您想要的格式方面提供更多帮助?

    【讨论】:

    • @dav1dMclean,感谢您的建议,我正在使用 LINQ to sql 进行数据访问,并且我的数据存储在 SQL 数据库中。它是我正在努力解决的数据访问部分,我会用我的视图模型更新问题。
    • 啊,好吧,(你可能想让你的视图模型从一个基础继承......永远不知道什么时候你需要在站点范围内添加一些东西......)。
    • 我没有使用 Linq to SQL,但除非我弄错了.. 您的查询将带回一个包含两个表中数据的对象,对吗?所以 Customers.CustomerName 可能会给出客户名称?我不知道我可能是老帽子,但我会考虑一个存储过程和一个具有正确结构的类。然后将 sp 运行到一个列表中或键入你的新类。然后根据需要使用该数据?我喜欢我的 DA 尽可能简单和快速(因此我不使用 Linq to SQL :p)->
    • code.google.com/p/dapper-dot-net -> 查看页面上的性能测试.. petaPoco 是一个不错的选择。 (不相关我知道只是想让你知道,以防你还没有意识到:))
    • @dav1dMclean,再次感谢,关于我如何在存储库界面中定义集合的任何想法?我将它用于一个对象,但不确定如何定义一个包含两个对象的集合, public IQueryable CustomerSites { get { return customerSitesTable; } }
    最近更新 更多