两次循环在视图中



我有此剃须刀视图:

@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>
}

使用此ViewModel:

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);
        }

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

@foreach(model.items.s。

,但仍然没有。

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

,您的模型看起来像:

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<CategoryViewModel>而不是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>

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

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

n.categoryid 不存在,因为n正在引用项目列表的项目(这也是列表)。

您的意思是:

 @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;
    }

,因此您以前的代码应该起作用。希望它有帮助

我的第一个答案的替代方法是离开模型,并视为当前拥有它。在控制器操作中,您要确保两个枚举的订单相对于类别具有相同的顺序。然后,您可以在这样的视图中将它们组合在一起:

<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>

最新更新