“object”不包含“CategoryName”的定义

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'
stack overflow 'object' does not contain a definition for 'CategoryName'
原文答案

答案:

作者头像

您正在将匿名对象列表传递给视图。

看看这个答案 Dynamic Anonymous type in Razor causes RuntimeBinderException

作者头像

我认为您正在尝试直接访问 <h2>@m.CategoryName</h2> ,也许您可​​以像 @m.SHP_Category.Name 一样访问它我真的不知道您代码中的类序列。试试 @m.

作者头像

看到这个答案 MVC Razor dynamic model, 'object' does not contain definition for 'PropertyName'

错误的原因是您的 GroupBy 语句创建的动态类型具有“内部”访问级别,视图不可见。您可以通过声明类型或使用 Explando 来纠正 - 如本答案和其他答案中所述。

作者头像

From

这样做的原因是匿名类型是在内部的控制器中传递的,因此只能从声明它的程序集中访问它。由于视图是单独编译的,动态绑定器抱怨它不能越过该程序集边界。

解决这个问题的一种方法是使用 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.
作者头像

请在这里使用 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>
}