如何在同一视图中显示来自多个实体的数据并按其中一个实体对它们进行分组
How can I display data from multiple entities in same view and group them by one of the entity
我有客户、项目、客户评论和项目评论。我想显示一个 table 按客户分组,然后是所有项目,并为每个有评论的客户以及每个有评论的项目显示最后提供的评论。
table 将在顶部显示客户名称,如果提供的话,后面是相应的最新评论。
如果提供的话,后面会列出该客户的所有项目及其最新评论。
我有客户端模型:
public class Client
{
public int Id { get; set; }
public string ClientName { get; set; }
public bool IsActive { get; set; }
public ICollection<ClientComment> ClientComments { get; set; }
public ICollection<Project> Projects { get; set; }
项目模型:
public class Project
{
public int Id { get; set; }
public string ProjectName { get; set; }
public int ClientId { get; set; }
public Client Client { get; set; }
public bool IsArchived { get; set; }
public ICollection<ProjectComment> ProjectComments { get; set; }
客户评价模型:
public class ClientComment
{
public int Id { get; set; }
public int? ClientId { get; set; }
public Client Client { get; set; }
public string StatusComment { get; set; }
public DateTime LastUpdateDate { get; set; }
public ClientComment ()
{
this.LastUpdateDate = DateTime.UtcNow;
}
项目评论模型:
public class ProjectComment
{
public int Id { get; set; }
public int? ProjectId { get; set; }
public Project Project { get; set; }
public string StatusComment { get; set; }
public DateTime LastUpdateDate { get; set; }
public ProjectComment ()
{
this.LastUpdateDate = DateTime.UtcNow;
}
最终结果应该是他们各自的 table headers:
ClientName1 | ClientStatusComment
ProjectName1 | ProjectStatusComment
ProjectName2 | ProjectStatusComment
ProjectName3 | ProjectStatusComment
ClientName2 | ClientStatusComment
ProjectName1 | ProjectStatusComment
ProjectName2 | ProjectStatusComment
ProjectName3 | ProjectStatusComment
您可以使用包含您需要在 view.Refer 中显示的属性的视图模型,如下所示:
ClientVM
和 ProjectVM
public class ClientVM
{
public string ClientName { get; set; }
public string ClientStatusComment { get; set; }
public List<ProjectVM> Projectlist { get; set; }
}
public class ProjectVM
{
public string ProjectName { get; set; }
public string ProjectStatusComment { get; set; }
}
填充 ViewModel
public class ClientsDetailsModel : PageModel
{
private readonly MyDbContext _context;
public ClientsDetailsModel(MyDbContext context)
{
_context = context;
}
[BindProperty]
public List<ClientVM> clientVMList { get; set; }
public async Task<IActionResult> OnGet()
{
var clientlist = _context.Clients
.Include(c => c.ClientComments)
.Include(c => c.Projects)
.ThenInclude(p => p.ProjectComments).ToList();
clientVMList = new List<ClientVM>();
foreach (var item in clientlist)
{
ClientVM clientVM = new ClientVM()
{
Projectlist = new List<ProjectVM>()
};
clientVM.ClientName = item.ClientName;
if (item.ClientComments != null && item.ClientComments.Any())
{
clientVM.ClientStatusComment = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().StatusComment;
}
else
{
clientVM.ClientStatusComment = "No StatusComment";
}
foreach (var projectItem in item.Projects)
{
ProjectVM projectVM = new ProjectVM();
projectVM.ProjectName = projectItem.ProjectName;
if (projectItem.ProjectComments != null && projectItem.ProjectComments.Any())
{
projectVM.ProjectStatusComment = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().StatusComment;
}
else
{
projectVM.ProjectStatusComment = "No StatusComment";
}
clientVM.Projectlist.Add(projectVM);
}
clientVMList.Add(clientVM);
}
return Page();
}
}
ClientsDetails.cshtml
@page
@model MultipleEntitiesInSameView.Pages.ClientsDetailsModel
<table class="table">
<thead>
<tr>
<th>
Name
</th>
<th>
LastStatusComment
</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.clientVMList)
{
<tr style="background-color:aliceblue;">
<td>
@Html.DisplayFor(modelItem => item.ClientName)
</td>
<td>
@Html.DisplayFor(modelItem => item.ClientStatusComment)
</td>
</tr>
@foreach (var projectItem in item.Projectlist)
{
<tr>
<td>
@Html.DisplayFor(modelItem => projectItem.ProjectName)
</td>
<td>
@Html.DisplayFor(modelItem => projectItem.ProjectStatusComment)
</td>
</tr>
}
}
</tbody>
</table>
4.Result :
我有客户、项目、客户评论和项目评论。我想显示一个 table 按客户分组,然后是所有项目,并为每个有评论的客户以及每个有评论的项目显示最后提供的评论。
table 将在顶部显示客户名称,如果提供的话,后面是相应的最新评论。 如果提供的话,后面会列出该客户的所有项目及其最新评论。
我有客户端模型:
public class Client
{
public int Id { get; set; }
public string ClientName { get; set; }
public bool IsActive { get; set; }
public ICollection<ClientComment> ClientComments { get; set; }
public ICollection<Project> Projects { get; set; }
项目模型:
public class Project
{
public int Id { get; set; }
public string ProjectName { get; set; }
public int ClientId { get; set; }
public Client Client { get; set; }
public bool IsArchived { get; set; }
public ICollection<ProjectComment> ProjectComments { get; set; }
客户评价模型:
public class ClientComment
{
public int Id { get; set; }
public int? ClientId { get; set; }
public Client Client { get; set; }
public string StatusComment { get; set; }
public DateTime LastUpdateDate { get; set; }
public ClientComment ()
{
this.LastUpdateDate = DateTime.UtcNow;
}
项目评论模型:
public class ProjectComment
{
public int Id { get; set; }
public int? ProjectId { get; set; }
public Project Project { get; set; }
public string StatusComment { get; set; }
public DateTime LastUpdateDate { get; set; }
public ProjectComment ()
{
this.LastUpdateDate = DateTime.UtcNow;
}
最终结果应该是他们各自的 table headers:
ClientName1 | ClientStatusComment
ProjectName1 | ProjectStatusComment
ProjectName2 | ProjectStatusComment
ProjectName3 | ProjectStatusComment
ClientName2 | ClientStatusComment
ProjectName1 | ProjectStatusComment
ProjectName2 | ProjectStatusComment
ProjectName3 | ProjectStatusComment
您可以使用包含您需要在 view.Refer 中显示的属性的视图模型,如下所示:
ClientVM
和ProjectVM
public class ClientVM { public string ClientName { get; set; } public string ClientStatusComment { get; set; } public List<ProjectVM> Projectlist { get; set; } } public class ProjectVM { public string ProjectName { get; set; } public string ProjectStatusComment { get; set; } }
填充 ViewModel
public class ClientsDetailsModel : PageModel { private readonly MyDbContext _context; public ClientsDetailsModel(MyDbContext context) { _context = context; } [BindProperty] public List<ClientVM> clientVMList { get; set; } public async Task<IActionResult> OnGet() { var clientlist = _context.Clients .Include(c => c.ClientComments) .Include(c => c.Projects) .ThenInclude(p => p.ProjectComments).ToList(); clientVMList = new List<ClientVM>(); foreach (var item in clientlist) { ClientVM clientVM = new ClientVM() { Projectlist = new List<ProjectVM>() }; clientVM.ClientName = item.ClientName; if (item.ClientComments != null && item.ClientComments.Any()) { clientVM.ClientStatusComment = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().StatusComment; } else { clientVM.ClientStatusComment = "No StatusComment"; } foreach (var projectItem in item.Projects) { ProjectVM projectVM = new ProjectVM(); projectVM.ProjectName = projectItem.ProjectName; if (projectItem.ProjectComments != null && projectItem.ProjectComments.Any()) { projectVM.ProjectStatusComment = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().StatusComment; } else { projectVM.ProjectStatusComment = "No StatusComment"; } clientVM.Projectlist.Add(projectVM); } clientVMList.Add(clientVM); } return Page(); } }
ClientsDetails.cshtml
@page @model MultipleEntitiesInSameView.Pages.ClientsDetailsModel <table class="table"> <thead> <tr> <th> Name </th> <th> LastStatusComment </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model.clientVMList) { <tr style="background-color:aliceblue;"> <td> @Html.DisplayFor(modelItem => item.ClientName) </td> <td> @Html.DisplayFor(modelItem => item.ClientStatusComment) </td> </tr> @foreach (var projectItem in item.Projectlist) { <tr> <td> @Html.DisplayFor(modelItem => projectItem.ProjectName) </td> <td> @Html.DisplayFor(modelItem => projectItem.ProjectStatusComment) </td> </tr> } } </tbody> </table>
4.Result :