Viewbag RuntimeBinderException:'object'不包含定义

时间:2014-02-23 00:12:33

标签: c# asp.net asp.net-mvc asp.net-mvc-4

如何通过ViewBag解决此错误以将数据传递到视图?

  

System.Core.dll中出现“Microsoft.CSharp.RuntimeBinder.RuntimeBinderException”类型的异常,但未在用户代码中处理

     

其他信息:'object'不包含'name'的定义

在控制器

var linq = (from c in db.Catogeries
            join a in db.Articals on c.Id equals a.CatogeryId
            select new  {name=c.Name,title=a.Title });
ViewBag.data = linq;

在视图中

@{         
     foreach (var item in ViewBag.data )
     {
          <p>@item.name</p>
     }
}

4 个答案:

答案 0 :(得分:4)

最简单的方法来修复此错误,创建一个类而不是使用匿名对象并使用强类型模型。

var linq = (from c in db.Catogeries
        join a in db.Articals on c.Id equals a.CatogeryId
        select new MyCategory { name=c.Name, title=a.Title });

ViewBag.data = linq;

View

foreach (var item in (IEnumerable<MyCategory>)ViewBag.data )
{
     <p>@item.name</p>
}

如果您坚持使用dynamic,可以查看以下问题:

Dynamic Anonymous type in Razor causes RuntimeBinderException

Simplest Way To Do Dynamic View Models in ASP.NET MVC 3

答案 1 :(得分:1)

问题实际上是由设置Viewbag值引起的。在这个过程中,.NET总是抛出一个内部异常,然后Visual Studio会进入调试器。

解决方案:仅针对您自己的代码中的异常使Visual Studio中断。 转到菜单工具/选项,选择左侧的调试,然后选择[v]选项&#34;启用我的代码&#34;。

答案 2 :(得分:1)

这是我如何解决我的问题,我希望如此 可以帮助别人:

我创建了一个类:

    public class MyClass
    {
        public decimal EmployeeId { get; set; }
        public string CategoryCode { get; set; }
        public string CategoryDesc { get; set; }
    }
}

在控制器:

var query = (from c in context.EmployeeCategory
             where(c.EMPLOYEE_ID == 22)
             join a in context.Categories on c.Category_CODE 
             equals a.Category_CODE
             select new MyClass
                         {
                             EmployeeId = c.EMPLOYEE_ID,
                             CategoryCode = a.Category_CODE,
                             CategoryDesc = a.Category_DESC
                         });
return View(query);

在视图中:

@model IEnumerable<MyClass>

@foreach (var item in Model)
{
            @item.EmployeeId <b> - </b>
            @item.CategoryCode <br />
            @item.CategoryDesc <br />
}

答案 3 :(得分:-2)

你只需要施展它。该视图不知道该对象是什么类型,因此在您投射它之前尝试枚举它将无法工作。类似的东西:

foreach (var item in (IEnumerable <dynamic>) ViewBag.data) { ... }

很抱歉,如果格式略有偏差,请尝试在手机上执行此操作。