'object'不包含'CategoryName'的定义

时间:2013-12-17 11:00:07

标签: asp.net-mvc

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'

5 个答案:

答案 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)

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.

答案 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>
}