我有此剃须刀视图:
@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>