我想显示与单个实体相关的不同实体的记录。
例如租户有一系列租金,租金又有收款。 我想在视图中显示所有租户的租金和付款。
以下是我在视图中的当前实现。
@foreach (var t in Model.Tenants)
{
<tr>
<td>@t.Fullname</td>
@foreach (var rents in t.Rents)
{
<td>@rents.Apartment.BedroomType</td>
<td>@rents.Apartment.MonthlyFee.ToString("N0")</td>
<td>@($"{@rents.Total.ToString("N0")}/{@rents.Type}")</td>
<td>@($"{@rents.DueDate.ToString("MMM yyy")}")</td>
foreach (var payments in rents.Payments)
{
<td>@payments.PaymentDate.ToString("MMM dd,yyyy")</td>
<td>@payments.AmountPaid.ToString("N0")</td>
<td>@payments.Balance</td>
}
}
</tr>
}
这当前工作正常,但我不想在客户端上进行大量过滤,我认为这不是一个好习惯,所以我想将逻辑移到我的控制器来处理所有记录过滤。
我想要做的是使用列表更改此实现,并将每个集合添加到自己的列表中。例如,付款将在其自己的租金清单中。租金将列在与特定租户相关的列表中。通过这样做,我可以根据租赁状态过滤租金或仅显示实际支付的付款。目前的实施并没有给我这个。
我真的可以在这里使用一些指导方针......
答案 0 :(得分:0)
我会说你只需做一个小改动。在您的视图模型中,有一个付款清单而不是租户(反之亦然)。请看下面的示例,了解我的意思:
[HttpGet]
public ActionResult Index(string bedRoomType = "", double amountPaid = 0)
{
var viewModel = new TenantIndexVm();
using (var context = new RentEntities())
{
viewModel.Payments = context.Payment.Where(x => (x.Rent.BedRoomType == bedRoomType || bedRoomType == "") && (x.AmountPaid >= amountPaid)).Include("Rent.Tenant");
}
return View(viewModel);
}
在视图中,您将遍历付款:
@foreach (var p in Model.Payments)
{
<tr>
<td>@p.Rent.Tenant.Fullname</td>
<td>@p.Rent.Apartment.BedroomType</td>
<td>@p.Rent.Apartment.MonthlyFee.ToString("N0")</td>
<td>@($"{@p.Rent.Total.ToString("N0")}/{@p.Rent.Type}")</td>
<td>@($"{@p.Rent.DueDate.ToString("MMM yyy")}")</td>
<td>@p.PaymentDate.ToString("MMM dd,yyyy")</td>
<td>@p.AmountPaid.ToString("N0")</td>
<td>@p.Balance</td>
</tr>
}
&#13;