【问题标题】:two foreach loops in a view视图中的两个 foreach 循环
【发布时间】:2014-03-08 05:22:14
【问题描述】:

我有这个剃刀观点:

@using Order.Models
@model CategoriesViewModel

@{
    ViewBag.Title = "Categories";
}
@using (Html.BeginForm())
{
    <div class="panel-group">                   
        @foreach (var p in Model.Categories)
        {
          <div class="panel panel-default">
              <div class="panel-heading">
                  <h4 class="panel-title">
                      <a data-toggle="collapse" data-parent="#accordion" href="#@p.ID.ToString()">
       @p.Name
        </a>                     
                  </h4>
              </div>
               <div id="@p.ID.ToString()" class="panel-collapse collapse">
                   <div class="panel-body">  
          @foreach (var m in p.Items)                           
                       {
                          //put items data here
                       }                      
                   </div>
    </div>
              </div>     
        }        
    </div>
}

使用这个视图模型:

namespace Order.Models
{
    public class CategoriesViewModel
    {
        public IEnumerable<RestCategories> Categories;
        public List<List<RestItem>> Items;
    }
}

控制器动作是:

[HttpGet]
        public ActionResult Categories()
        {
            List<List<RestItem>> ItemsForCategory = new List<List<RestItem>>();
            API OneApi = new API();
            IEnumerable<RestCategories> itemsResult = API.GetCategoryResults("test", "test");
            if (itemsResult.Count() > 0)
            {                
                foreach (RestCategories cat in itemsResult)
                {
                    ItemsForCategory.Add(OneApi.GetItemsForCategory(ConfigurationManager.AppSettings["Key1"], ConfigurationManager.AppSettings["Key2"], cat.ID.ToString()));
                }
            }

            CategoriesViewModel modelCat = new CategoriesViewModel
            {
                Categories = itemsResult          
                .OrderBy(i=>i.Order),
                Items = ItemsForCategory                             
            };
            return View(modelCat);
        }

现在,我不确定这是否是正确的做法,但我想显示类别,并且在这些类别中我想显示该类别中的项目。我可以获取列表中的所有项目,正如您在视图中看到的那样,我正在尝试遍历 Items 集合,但我无法从模型中获取 Items 属性。我也试过这种方法

@foreach(Model.Items.Where(n=>n.CategoryId = p.ID) 中的变量 m)

但还是什么都没有。

【问题讨论】:

  • 我不认为你需要在你的物品上列出
  • 是的,我可以看到类别,但看不到项目。我使用的方法是返回项目列表,然后将其放入每个类别 ID 的新列表中,这就是我使用双列表的原因。 @MattBodily 感谢帮助我
  • 如果你只返回一个列表 ,其中包含一个列表中的所有项目,第二个 foreach 将为你解析它们。您无需将它们放入第二个列表中

标签: c# asp.net-mvc razor


【解决方案1】:

您可以只拥有类别及其关联项,然后将这些项的列表传递到视图中,而不是在模型中拥有两个可枚举项。

所以你的模型看起来像:

public class CategoryViewModel
{
    public RestCategories Category;
    public List<RestItem> Items;
}

您的控制器会执行以下操作:

IEnumerable<RestCategories> categories = API.GetCategoryResults("test", "test");
var categoryModels = categories.OrderBy(c => c.Order)
                               .Select(c => new CategoryViewModel
                                       {
                                           Category = c,
                                           Items = OneApi.GetItemsForCategory(ConfigurationManager.AppSettings["Key1"], ConfigurationManager.AppSettings["Key2"], cat.ID.ToString())
                                       })
                               .ToList();
return View(categoryModels);

您的视图的模型类型将是 IEnumerable&lt;CategoryViewModel&gt; 而不是 CategoriesViewModel,并且会执行以下操作:

<div class="panel-group">                   
    @foreach (var m in Model)
    {
        <div class="panel panel-default">
            <div class="panel-heading">
                <h4 class="panel-title">
                    <a data-toggle="collapse" data-parent="#accordion" href="#@m.Category.ID.ToString()">
                        @m.Category.Name
                    </a>                     
                </h4>
            </div>
            <div id="@m.Category.ID.ToString()" class="panel-collapse collapse">
                <div class="panel-body">  
                    @foreach (var i in m.Items)                           
                    {
                        //put items data here
                    }                      
                </div>
            </div>
        </div>     
    }        
</div>

【讨论】:

  • 感谢@AndrewCooper 这个解决方案帮助了我。
【解决方案2】:

您正在尝试访问一个可能不存在的值:

@foreach (var m in Model.Items.Where(n=>n.CategoryId = p.ID))

n.CategoryId 不存在,因为 n 引用了 Items 列表(也是一个列表)的一个项目。

你的意思是也许:

 @foreach (var m in Model.Items.Where(n=>n.SOMETHING = p.ID))

我写一些东西是因为你有一个列表,也许它应该是:

public List<RestItem> Items;

然后 n 将拥有 RestItem 并且您将能够访问它的属性。

如果您需要的是每个类别的列表,那么您应该拥有的是:

namespace Order.Models
{
    public class CategoriesViewModel
    {
        public IEnumerable<RestCategories> Categories;
        public List<ListRestItem> Items;
    }
    public class ListRestItem
    {
       public int CategoryId;
       public List<RestItem> Items;

    }

有了这个,你以前的代码应该可以工作了。 希望对你有帮助

【讨论】:

    【解决方案3】:

    我的第一个答案的替代方法是保留模型和视图类型,就像您目前拥有的那样。在控制器操作中,您要确保两个可枚举项在类别方面具有相同的顺序。然后,您可以像这样在视图中组合它们:

    <div class="panel-group">                   
        @foreach (var m in Model.Categories.Zip(Model.Items, (c, i) => new { Category = c, Items = I }))
        {
            <div class="panel panel-default">
                <div class="panel-heading">
                    <h4 class="panel-title">
                        <a data-toggle="collapse" data-parent="#accordion" href="#@m.Category.ID.ToString()">
                            @m.Category.Name
                        </a>                     
                    </h4>
                </div>
                <div id="@m.Category.ID.ToString()" class="panel-collapse collapse">
                    <div class="panel-body">  
                        @foreach (var i in m.Items)                           
                        {
                            //put items data here
                        }                      
                    </div>
                </div>
            </div>     
        }        
    </div>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多