Foreach循环不显示第一个条目

时间:2013-11-11 12:52:59

标签: c# asp.net-mvc visual-studio-2012 razor for-loop

在我们的MVC4应用程序中,我的数据库有一个Orders表,一个Products表和一个Category表。每个订单在外键关系中都有一个产品(加上数量),并且该产品属于具有外键的类别。

因此Order有OrderId,ProductId(FK到产品),数据加数量,Product有ProductId,Name和CategoryId(FK到Category),Category有CategoryId和Name。

现在我们制作了一个“购物清单”,其中显示了当天订购的类别,并在类别名称下方显示了产品。

要仅显示此日期的产品,我们使用下面的foreach循环:

@model Tuple<List<myproject.Models.Order>, List<myproject.Models.Order>>
@foreach (var item1 in Model.Item1)
    {
        if (item1.Date.ToString("d").Equals(DateTime.UtcNow.Date.ToString("d")))
        {
            <tr>    
                <td>
                    <h3>@Html.DisplayFor(catName => item1.Product.Category.Name)</h3>
                </td>
            </tr>
        }

        foreach (var item2 in Model.Item2)
        {
            if (item2.Product.Category.Name.Equals(item1.Product.Category.Name) &&
                 item2.Date.ToString("d").Equals(DateTime.UtcNow.Date.ToString("d")))
            {

                <tr>
                    <td>

                            @Html.DisplayFor(productName => item2.Product.Name)
                            &nbsp(x @Html.DisplayFor(quantity => item2.Quantity))

                    </td>
                </tr>

            }
        }
    }

要显示类别和类别中的产品,它会错过列表中类别的名字。输出是:

Apple   (x 1)  
Banana  (x 1)  

Snacks
Fries   (x 3)  
Hamburger(x 1)  

Veggies
Tomato   (x 1)  

而不是

Fruit 
Apple   (x 1)  
Banana  (x 1)  

Snacks
Fries   (x 3)  
Hamburger(x 1)  

Veggies
Tomato   (x 1)  

过去一小时我一直在打破这个问题。有人可以解释为什么它没有显示“水果”的条目吗?

2 个答案:

答案 0 :(得分:1)

你用if块包围了它。从问题中解释为什么会出现在这里或者你想用它完成什么,这一点并不清楚。很可能在您尝试过滤类别或存储相关数据的方式方面存在逻辑缺陷。在任何情况下,如果删除它,您应该看到所期望的类别名称。

@foreach (var item1 in Model.Item1)
{
    <tr>    
        <td>
            <h3>@Html.DisplayFor(catName => item1.Product.Category.Name)</h3>
        </td>
    </tr>

    foreach (var item2 in Model.Item2)
    {
        ...
    }
}

答案 1 :(得分:1)

我的猜测是这是一个夏令时问题 - 您可能会发现您的UTC日期已经过调整,以便日期在表示为UTC时发生变化。例如,在英国,如果我在01/04/2013 23:00:00当地时间创建了一条记录,则在UTC时间内表示为02/04/2013 00:00:00,因为我们在此期间(+1小时)观察到DST。

要避免这些类型的问题,您应该将UTC转换回本地时间并使用DateTime.Now.Date进行比较。