另一个Foreach的foreach?

时间:2012-09-20 12:28:32

标签: arrays asp.net-mvc-3 view foreach

很难解释我的问题,但我会尽可能地更明确。也很抱歉我的英文...

实际上,我认为这个阵列。 Array

检索以下内容的代码:

        @foreach (var item in Model)
        {
              TimeSpan result = DateTime.Now - item.OrderDate;

              if (result.Days < 31)
              {            
                    <tr border="1" bgcolor="@Odd">
                       <td> @Html.DisplayFor(modelItem => item.Username) </td>    
                       <td> @Html.DisplayFor(modelItem => item.OrderId) </td>  
                        <td>
                            <ul style="list-style-type:none; padding:0; margin:0">
                                @if (item.OrderDetails != null)
                                {
                                    foreach (var o in item.OrderDetails)
                                    {
                                        if (o.Pack == null)
                                        { 
                                            <li>  @Html.DisplayFor(modelItem => o.Product.Name)  </li>
                                        }
                                        else
                                        {  
                                            <li> <text>Pack</text>  @Html.DisplayFor(modelItem =>  o.Pack.Name)  </li>
                                        }
                                    }
                                }  
                            </ul>             
                        </td>
......... other td.............  
                    </tr>
              }                                        // 1116 = 36 months
              else if (result.Days > 31 && result.Days <= 1116)
              {
                  if (item.OrderDetails != null)
                  {
                      foreach (var a in item.OrderDetails)
                      {
                          if (a.Pack != null)
                          {          


                            <tr border="1" bgcolor="@Odd">    
                                <td> @Html.DisplayFor(modelItem => item.Username) </td>
                                <td> @Html.DisplayFor(modelItem => item.OrderId) </td>  

                                <td> 
                                    <ul style="list-style-type:none; padding:0; margin:0"> 
                                        @if (item.OrderDetails != null)
                                        {
                                            foreach (var o in item.OrderDetails)
                                            {
                                                if (o.Pack != null)
                                                {
                                                <li><text>Pack </text> @Html.DisplayFor(modelItem => o.Pack.Name)</li> 
                                                }
                                            }
                                        } 
                                    </ul> 
                                </td>      
    ......... other td.............                         
         </table>

所以,你知道,我有两种产品:产品和包装。在我的第一个IF条件(result.days&lt; 31)中,我检索包和产品,就像我的订单号59一样,因为订单日期少于31天。这是工作找到的。

现在,我的第二个IF条件&gt; 31&amp; &lt; 1116,我想要检索我只是我的PACK。它工作正常,我只有两个包,我的产品没有显示,这很好(不要注意单位价格和数量列,我只是忘记取消评论一些线在我拍摄截图的那一刻为什么有价格和数量应该什么都没有。)但就像你可以看到的那样,当我处于第二个状态时,它会为一个订单检索两行,因为我在另一个订单中有两个foreach。我怎么能通过它,只有像我的第一个条件一样?

我不知道我是否清楚......你可能想知道我在这里使用两种型号。一个OrderModel和一个OrderDetailModel。 第一个包含OrderId,OrderDate,Username,ClientId 第二个包含OrderDetailId,OrderId,ProductId,UnitPrice(for product),PackId,UnitPricePack。

非常感谢您的回答,提示,链接,等等...

1 个答案:

答案 0 :(得分:1)

这不是必需的:

                  foreach (var a in item.OrderDetails) 
                  {    
                      if (a.Pack != null) 
                      {         

如果您有31天到1116天之间的商品,并且它有产品且没有包装,您仍然会得到一个tr元素,而产品&amp;包列将为空。

如果这对你没有好处,那就制作一个bool var,也许叫做havePack,

                  var havepack = false,
                  foreach (var a in item.OrderDetails) 
                  {    
                      if (a.Pack != null) 
                      {         
                          havePack = true;
                      }
                  }
                  if (havePack)
                  {  //now make your <tr> element here