【发布时间】:2016-10-05 13:28:46
【问题描述】:
我试图在 for each 循环的帮助下显示各种信息。 我为每个循环创建了一个循环,它遍历项目列表。在此列表中还有另一个项目列表。
我的代码是:
@foreach (Invoice invoice in ViewBag.Invoices)
{
<table>
<tr>
<th>Customer</th>
<th>Product</th>
<th>Quantity</th>
<th>Price</th>
<th>Total Price</th>
</tr>
@foreach (OrderItem orderItem in invoice.OrderItems)
{
<tr>
<td>@invoice.Customer.Firstname @invoice.Customer.Lastname</td>
<td>@orderItem.Product.Title </td>
<td>@orderItem.Quantity </td>
<td>@orderItem.Product.Price </td>
<td>@orderItem.TotalPrice</td>
</tr>
}
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td class="border-top">@invoice.TotalPrice</td>
</tr>
</table>
}
但是,我不希望它显示两次客户姓名。而且我不想让客户独自一人。因此,我尝试将起始标签与客户一起放在 foreach 循环之外,而不是用 <tr> 标签结束 foreach 循环。所以它看起来像这样:
@foreach (Invoice invoice in ViewBag.Invoices)
{
<table>
<tr>
<th>Customer</th>
<th>Product</th>
<th>Quantity</th>
<th>Price</th>
<th>Total Price</th>
</tr>
<tr>
<td>@invoice.Customer.Firstname @invoice.Customer.Lastname</td>
@foreach (OrderItem orderItem in invoice.OrderItems)
{
<td>@orderItem.Product.Title </td>
<td>@orderItem.Quantity </td>
<td>@orderItem.Product.Price </td>
<td>@orderItem.TotalPrice</td>
</tr>
<tr>
}
<td></td>
<td></td>
<td></td>
<td></td>
<td class="border-top">@invoice.TotalPrice</td>
</tr>
</table>
}
更新的解决方案
我遵循@Ed Plunkett 的明智的话并将本地字符串初始化为null。我创建了一个 if/else 语句来检查是否设置了前一个客户,并在循环结束时初始化了前一个客户的值。
@{string prevCust = null; }
@foreach (Invoice invoice in ViewBag.Invoices)
{
<table>
<tr>
<th>Customer</th>
<th>Product</th>
<th>Quantity</th>
<th>Price</th>
<th>Total Price</th>
</tr>
@foreach (OrderItem orderItem in invoice.OrderItems)
{
<tr>
@if (prevCust != invoice.Customer.Firstname + invoice.Customer.Lastname)
{
<td>@invoice.Customer.Firstname @invoice.Customer.Lastname</td>
}
else
{
<td></td>
}
<td>@orderItem.Product.Title </td>
<td>@orderItem.Quantity </td>
<td>@orderItem.Product.Price </td>
<td>@orderItem.TotalPrice</td>
</tr>
prevCust = invoice.Customer.Firstname + invoice.Customer.Lastname;
}
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td class="border-top">@invoice.TotalPrice</td>
</tr>
</table>
}
【问题讨论】:
-
在 之前占用那个“}”字符?
-
您打开行 (
<tr>) 一次并关闭行 (</tr>) 零次或多次 次。无论 Razor 是否聪明到知道你正在这样做,都不要那样做,因为你的 HTML 会被破坏。只需创建一个局部变量StringprevCustomerName,初始化为null,并在循环块的end处更新它。在循环块的开头,如果新客户名称与prevCustomerName相同,则不要将其插入该行的 HTML 中。 -
顺便说一句,您在第三个
之后忘记了一个 -
当您的收藏不包含任何元素时会发生什么?在这种情况下,输出为
<tr><tr>,这是无效的。 -
对不起,我在代码中放了太多
,我现在按我的意思编辑它。
标签: c# asp.net-mvc foreach