2012-07-11 4 views
1

저는 MVC를 처음 사용합니다. 내 질문에 어리 석거나 너무 간단한 것처럼 들리더라도 실례합니다. 데이터베이스 액세스를 위해 엔터티 데이터 모델을 사용하고 있습니다. 그래서 내 모델 폴더에서 EDMX 파일을 추가했고 컨트롤러와 강력한 형식의 뷰에서 모델 클래스에 액세스 할 수 있습니다. 예를 들어 내 컨트롤러에서 두 개 이상의 테이블에 액세스 할 때 문제가 발생합니다.익명 객체 컬렉션을 컨트롤러에서보기로 전달하는 방법

Departments(DepartmentID, DepartmentName, DepartmentPhone) 
Insurances(InsuranceID, InsuranceName, InsuranceAddress) 
Employees(EmployeeID, EmpFName, EmpLName, DepartmentID, InsuranceID) 

을 그리고 자신의 부서와 보험 정보와 종업원의 목록을 표시하려면 :

것은 내 DB에 테이블을 다음과 같은 경우. '그래서 내가 할 수있는

using (var context = new MyEntities()) 
     { 
      var model = (from d in context.Departments 
         join e in context.Employees on d.DepartmentID equals e.DepartmentID 
         join I in context.Insurances on I.InsuranceID equals e.InsuranceID 

         select new 
         { 
          DepartmentID = d.DepartmentID, 
          EmployeeID= e.EmployeeID, 
          EmpFName= e.EmpFName, 
          EmpLName= e.EmpLName, 
          DepartmentName= d.DepartmentName, 
          InsuranceName= I.InsuranceName 

         }).ToList(); 

      return View(model); 
     } 

내 모델 폴더에이 익명 형식의 클래스가없는 : 내 컨트롤러의 동작 방법에

나는 EDM를 사용하여 DB를 액세스하고 익명의 형태로 정보를 얻을 수 강력하게 형식화 된보기를 작성하십시오. 이 목록을보기로 전달하는 가장 좋은 방법은 무엇입니까? 콜렉션이 너무 큰 경우에는 뷰백을 사용하는 것이 과도합니다. 이 익명 클래스에 대한 새로운 모델을 생성하는 것은 컨트롤러 액션 메소드에서 선택을 변경하면 항상 업데이트되어야하므로 소리가 나지 않습니다.

모든 제안을 환영합니다. 나는 SO에 관한 다른 질문을 살펴 보았으나 관련성있는 것을 찾지 못했습니다.

감사합니다.

답변

2

나는 새로운 클래스를 추가, 그래서

오른쪽 프로젝트를 클릭 강력한 형식의 뷰를 만들 수 없습니다 내 모델 폴더에이 익명 형식의 수업이없는 ... 이제 Model 폴더에 유형이 있습니다. 이것은 ASP.NET MVC => 뷰 모델로 이동하는 방법입니다. 다음

그리고 분명히 당신이보기에이 유형을 전달합니다

select new MyViewModel 
{ 
    DepartmentID = d.DepartmentID, 
    EmployeeID = e.EmployeeID, 
    EmpFName = e.EmpFName, 
    EmpLName = e.EmpLName, 
    DepartmentName = d.DepartmentName, 
    InsuranceName = I.InsuranceName 
}).ToList(); 

이제보기가 강력하게이보기 모델에 입력된다 물론이 :

@model IEnumerable<MyViewModel> 
... 
+0

이 방법은 당신의 인텔리 지원을 제공하여 뷰를 제공하고, 모든 * For For 메소드를 쉽게 사용할 수있게 해준다. 또한 업데이트 또는 삽입이 유용 할 경우 동일한 모델에서 정보를 다시 보낼 수있는 옵션을 제공합니다. –

+0

Darin plz 내 답장을 참조하십시오. – shazia

+0

'foreach' 루프에서'@ model'을 사용하는 이유는 무엇입니까? '@ model'은보기가 강하게 입력되는 모델을 나타내는 (@ 상단에 보통 한 번만)보기에서 한 번만 나타나야합니다 :'@model List '. 그리고'@ model' 대신에 루프 안에서'@ item'을 사용하십시오. –

0

미리 정의 된 강력한 형식의 ViewModels가 이동하는 방법입니다. 겉으로보기에 중복 된 코드를 여러 곳에서 업데이트해야하는 것은 고통이지만, 경험상 작은 프로젝트에서는 문제가됩니다. 프로젝트가 커짐에 따라 데이터베이스 모델 객체 (엔티티)와 뷰에 전달 된 뷰 모델 (예 : 유효성 검사 및 특성 및 뷰 특정 데이터 처리) 간의 차이점을 확인하기 시작하면이 시점에 도달하면 별도의 Entity 및 ViewModel 정의.

다시 주제로 : 문제의 대안은 리플렉션을 사용하여 익명 유형을 Dictionary<String,Object> 객체로 변환하는 것입니다. ASP.NET MVC는 new { foo = "bar" } -syntax 표현식을 Route Values ​​및 HTML 속성에 대한 사전으로 변환하기 위해이 작업을 수행합니다. 성능은 받아 들일 만하지만, 단일 HTTP 요청에 대해 10,000 개의 객체에 대해 수행하지 마십시오. 그렇지 않을 경우 작동이 느려질 수 있습니다.

Object anonymousType = new { whatever = "foo" }; 
Dictionary<String,Object> dict = new Dictionary<String,Object>(); 

foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(anonymousType)) { 
    Object value = descriptor.GetValue(anonymousType); 
    dict.Add(descriptor.Name, value); 
} 

은 물론이 당신의 조회수가 컴파일 타임 유형 검사에서 도움이되지 않으며 당신의 문서화 된 목록을 유지해야한다는 것을 의미 : 여기

는 대한 코드는 같을 것이다 무엇 사전 키 (보기에서 키를 반복하지 않는다고 가정).

자연스럽게 보이기 때문에 익명 형식이 자동으로 IDictionary를 구현하지 않는다는 사실에 놀랐습니다.

0

dynamic 유형은 친구입니다.느슨한 타입으로

당신은 당신의 모델로 동적를 가지고,보기를 선언 할 수

@model dynamic 

당신이 강하게 문제는 생각

<h1>Model.DepartmentId</h1> - <h2>Model.DepartmentName</h2> 
<span>Model.EmployeeId</span> 

보기 입력 않는 한 당신은 모델 속성에 액세스 것, 그 역학은 내부 속성을 포함하고 있습니다. MVC2를 사용하는 경우 작동하려면 약간 trick이 필요합니다. MVC3 이상에서는 더 이상 필요하지 않습니다.

관련 문제