2014-02-23 2 views
4

ViewBag까지보기에 데이터를 전달하려면이 오류를 어떻게 해결할 수 있습니까? '객체'에 대한 정의가 포함되어 있지 않습니다Viewbag RuntimeBinderException : 'object'에 정의가 없습니다.

유형 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException'의 예외가

추가 정보는 System.Core.dll에 발생했지만 사용자 코드에서 처리되지 않았습니다 이름이 '컨트롤러에서

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> 
    } 
} 
+0

익명 대신 사용자 정의 클래스를 사용할 수 있습니다. 'new CategoryModel {name = c.Name, title = a.Title}' –

+0

ViewBag을 사용하여 모델을 전달하는 작업을 중단하십시오. 모델을 사용하여 정보를 전달하십시오. http : //tech.trailmax.info/2013/12/asp-net-mvc-viewbag-is-bad/ – trailmax

답변

1

그냥 캐스팅하면됩니다. 뷰에는 어떤 유형의 객체인지 알 수 없으므로 열거하려고 시도 할 때까지 작동하지 않습니다. 다음과 같이하십시오 :

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

죄송합니다. 형식이 약간 꺼져있는 경우, 전화로이를 시도합니다.

+0

도움이되지 않습니다. 로컬에서 동일한 오류가 발생했습니다. –

+0

같은 오류가 나타납니다. ( – user3234114

4

가장 단순한 익명 객체를 사용하는 대신 클래스를 만드는이 오류를 수정하고 강력한 형식의 모델을 사용하는 방법. View에서

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; 

: 문제는 행위

Dynamic Anonymous type in Razor causes RuntimeBinderException

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

+0

'(IEnumerable )'로 캐스팅 할 필요가 없습니다. –

+0

예보기 모델 클래스를 만드는 것이 해결책이며 [여기] (http://stackoverflow.com/questions/7652749/object-does-not -contain-a-definition-for-x)는 나를 도운 하나의 대답이다. – stom

1

입니다 :

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

당신이 dynamic 사용에 대한 주장 경우 이러한 질문 좀 걸릴 수 있습니다 값이 Viewbag으로 설정되어 있습니다. 이 프로세스에서 .NET은 항상 내부 Exception을 던지고 Visual Studio가 디버거로 나옵니다.

해결 방법 : Visual Studio에서 예외 코드를 자신의 코드로 중단하십시오. 도구/옵션으로 이동하여 왼쪽의 디버깅을 선택하고 [v] 옵션 "내 코드 만 사용"을 선택하십시오. 여기

1

나는 내 문제를 해결하는 방법 내가이 사람이 도움이 될 수 있습니다 희망 :보기에

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); 

: 컨트롤러에서

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

:

내가 클래스를 생성 :

@model IEnumerable<MyClass> 

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