2011-04-13 7 views
1

탐색이 가능한 레이아웃이있는 사이트가 있다고 가정 해 보겠습니다. 이 탐색은 사용자가 선택한 옵션에 따라 페이지가 요청 될 때마다 작성됩니다. 이 네비게이션은 실제로 레이아웃과 관련이 있다는 점을 제외하고는 제시된 특정 뷰와 관련이 없습니다. 문제는 ViewData에 삽입해야하는지 또는 Model이 NavigationModel을 상속해야하는지 여부입니다.모델에 뷰를 작성하는 데 필요한 모든 데이터가 있어야합니까?

ViewBag.NavItems = navItems; 

또는

public abstract class NavigationModel 
{ 
    public List<NavItem> NavItems { get; set;} 
} 

public class HomeModel : NavigationModel 
{ 
} 

답변

4

내비게이션을 렌더링하기 위해보기 내부에 Html.RenderAction을 사용하는 것이 이상적입니다. 이것은 NavigationController에서 뷰에 직접 메뉴를 렌더링하는 작업을 호출합니다.

일부 MVC 순수 주의자는 Html.RenderAction이 진정한 MVC 아키텍처를 깨뜨린다고 생각합니다. 나는 당신이 렌더링하고있는 "메인"뷰의 주된 책임이 아닌 뷰의 특정 부분을 렌더링하는 책임을 위임하는 방법이라고 생각합니다.

+0

아마도, 또는 @ Html.Partial ("Navigation", HomeModel) Navigation의 모델 유형은 NavigationModel입니다. Doesnt RenderAction은 해당 작업에 대해 전체 파이프를 다시 실행합니까 ?? – CrazyDart

+0

'RenderPartial'을 사용하면 이제 탐색 부분 뷰에 전달할 모델을 제공해야합니다. 따라서 주 모델로 전달되는 모델에이 모델이 있어야합니다. 모델을 알기도 전에 뷰에 부분 뷰를 충족시키는 모델 인 모델이 10 개 있습니다. –

+0

네, 흥미로운 거래입니다. 현재 모델에있는 모든 소품을 가지고 보트에 있습니다. 컨트롤러에서 OnActionExecuted를 사용하여 만족시키기는 쉽지만 RenderAction을 사용하기에는 너무 무겁다고 생각하면 그 솔루션을 좋아합니다. .. 내가 사용하곤했다. – CrazyDart

2

는 모델 뷰를 구축하는 데 필요한 모든 데이터를 포함해야 하는가?

확실하고 확실합니다. 질문은

,이는 NO 절대적으로 확실히을 ViewData

에 넣어해야합니다.

이 탐색 위젯이 사이트와 완전히 독립적 인 부분으로 간주 될 수도있는 경우 Html.Action and Html.RenderAction을 사용할 수도 있습니다.

+0

또한 뷰 모델에 추가되기 전에 데이터가 구체화되어야합니다! 뷰에서 실행 된 쿼리는 얼굴을 녹입니다. –

+0

전적으로 동의하지만 뷰 안의 RenderAction이 경계선을 약간 변경하지 않습니까? 보기를 렌더링하는 것을 잊어 버린 더 많은 데이터를 얻기 위해 컨트롤러로 돌아 가야한다는 것을 의미합니까?! 이것은 RenderAction을 repo처럼 사용하는 것과 어떻게 다른가요? – CrazyDart

+0

@CrazyDart 탐색보기 모델에 ViewData를 사용하고 전역 작업 필터를 통해 데이터를 채우기를 선호하지만 RenderAction을 사용하면 일부 프로그래머에게 더 익숙 할 수 있습니다. 어느 쪽이든 작동합니다. – Ryan

관련 문제