public ActionResult Index()
{
var groups = db.SHP_Products
.GroupBy(c => c.SHP_Category.Name,
(category, items) => new
{
CategoryName = category,
ItemCount = items.Count(),
Items = items
}
);
ViewBag.group = groups.ToList();
return View();
}
运行时会显示如下错误:
<ul>
@foreach (var m in ViewBag.group)
{
<h2>@m.CategoryName</h2>
<a href="#" class="prev1">Previous</a><a href="#" class="next1">Next</a>
<li></li>
}
</ul>
'object' does not contain a definition for 'CategoryName'
答案 0 :(得分:0)
您正在将匿名对象列表传递给View。
看一下这个答案Dynamic Anonymous type in Razor causes RuntimeBinderException
答案 1 :(得分:0)
我认为您正在尝试直接访问<h2>@m.CategoryName</h2>
,可能您可以像@m.SHP_Category.Name
那样访问它。我真的不知道您的代码中的类序列。试试@m.
答案 2 :(得分:0)
请参阅此回答MVC Razor dynamic model, 'object' does not contain definition for 'PropertyName'
错误的原因是GroupBy语句创建的动态类型的访问级别为“internal”,View不可见。您可以通过声明类型或使用Explando来纠正 - 正如本答案和其他答案中所讨论的那样。
答案 3 :(得分:0)
这样做的原因是匿名类型在内部控制器中传递,因此只能从声明它的程序集中访问它。由于视图是单独编译的,因此动态绑定器会抱怨它无法越过该程序集边界。
解决此问题的一种方法是使用System.Dynamic.ExpandoObject
。
public static ExpandoObject ToExpando(this object obj)
{
IDictionary<string, object> expandoObject = new ExpandoObject();
new RouteValueDictionary(obj).ForEach(o => expandoObject.Add(o.Key, o.Value));
return (ExpandoObject) expandoObject;
}
然后:
ToExpando(groups); // might need toList() it too.
答案 4 :(得分:0)
请在此处使用ViewData而不是ViewBag。
控制器:
public ActionResult Index()
{
var groups = db.SHP_Products
.GroupBy(c => c.SHP_Category.Name,
(category, items) => new
{
CategoryName = category,
ItemCount = items.Count(),
Items = items
}
);
ViewData["groups"] = groups.ToList();
return View();
}
查看:
<ul>
@foreach (var m in (dynamic) ViewData["groups"])
{
<h2>@m.CategoryName</h2>
<a href="#" class="prev1">Previous</a><a href="#" class="next1">Next</a>
<li></li>
}