2010-03-19 3 views
0

나는 여러 개의 "자식"테이블이있는 메인 테이블을 가지고 있습니다. TableA 및 TableAChild1 및 TableAChild2.내 "필터링"로직은 View 또는 Controller에서 Linq-2-SQL 및 ASP.NET-MVC와 함께 있어야합니까?

TableA의 정보를 표시 한 다음 TableAChild1과 TableAChild2에있는 모든 항목의 두 열을 표시하는 뷰가 있으며 부분보기로 렌더링됩니다.

두 자식 테이블 모두 VisibleToAll에 대한 비트 필드가 있으며 사용자 역할에 따라 관련된 모든 행 또는 VisibleToAll = true 인 관련 행을 표시하려고합니다. 이 컨트롤러에 있어야처럼

이 코드는 느낌하지만 약자로, 컨트롤러 (limmited 버전)과 같이 보이기 때문에 나는 그것이 어떻게 보일지 모르겠어요 :

return View("TableADetailView", repos.GetTableA(id)); 

겠습니까을 이 같은 일이 심지어 일하고 내 DataContext가 전송되면 VisibleToAll == false를 갖는 모든 행을 삭제하는 것이 좋지 않을까요?

var tblA = repos.GetTableA(id); 
tblA.TableAChild1 = tblA.TableAChild1.Where(tmp => tmp.VisibleToAll == true); 
tblA.TableAChild2 = tblA.TableAChild2.Where(tmp => tmp.VisibleToAll == true); 
return View("TableADetailView", tblA); 

또한 기본보기에서 RendarPartial 호출하는 로직을 추가하는 간단한 것이다 :

<% Html.RenderPartial("TableAChild1", Model.TableAChild1.Where(tmp => tmp.VisibleToAll == true); %> 

답변

1

그것은 내가 생각하는 훌륭한 토론의 주제입니다. 내게는 두 가지 명확한 경로가 있습니다 :

지연된 실행 경로 항상 ToList를 사용하려면 항상 컨트롤러에서 AsQueryable을 사용하십시오. 즉, 프레젠테이션에 필요한 데이터 만 검색되고 View ToList 등에서 필요한 경우에만 호출됩니다.

프레젠테이션 모델 이미 필터링 된 모델 클래스 또는 결과를 사용하여 표시 할 데이터를 준비하십시오. 보기를 예상되는 형식으로 강하게 입력하십시오.

필자는 순수 MVC 구조에서 컨트롤러가 정보를 얻는 것에 대해 걱정해야하고 뷰는 모드 만 표시해야하지만 지연된 실행을 선호합니다.

관계없이, 리포지토리와 함께 AsQueryable을 사용하고 있는지 확인하십시오.

+0

내 저장소가 IQueryable 항목을 반환합니다. 그러나이 경우에는 하나의 레코드와 하위 레코드가 표시되기 때문에 부모 테이블의 컨트롤러에서 이미 SingleOrDefault()를 호출했기 때문에 연기 된 실행 방법이 확실하지 않습니다. – Nate

+1

+1은 합리적이며보기 모델에 대해 설교하지 않기 때문에 +1합니다. – jfar

3

나를 위해 질문이 없습니다입니다. 컨트롤러는 절대로 IQueryable을 뷰에 반환해서는 안됩니다. 뷰는 이러한 필터링을 수행 할 논리를 가져서는 안되기 때문에 컨트롤러 또는 컨트롤러가 호출하는 부분에서 수행되어야합니다. 당신이 그런 논리를 가지고 있다면 너무 똑똑합니다! 나는 "보기 모델에 대한 설교가"(이전 게시물에 jfar으로 언급 됨)이나 모범 사례가 있지만 그 이유 때문에 정의 된 것처럼 들릴지도 모른다. 논리가 너무 많은 뷰는 관리하기가 너무 어렵습니다. ASP.NET (또는 고전적인 ASP)을 사용하면됩니다.

솔직히 컨트롤러가 IQueryable을이 용도로 사용해야한다고 생각조차하지 않습니다. 이 논리는 목록을 컨트롤러에 반환하는 별도의 레이어에 포함되어야합니다. 어디서나 IQueryable을 사용하는 문제는 동일한 레이어에있을 때 작동하기 때문에 작동하지만 WCF 서비스 뒤에 데이터 액세스를 배치하면 전체 응용 프로그램이 폭발 할 수 있기 때문입니다. 당신의 .뷰와 컨트롤러에있는 문은 컨텍스트를 더 이상 사용할 수 없기 때문에 컨텍스트에 액세스 할 수 없다는 불만을 표시합니다.

관련 문제