2009-06-24 2 views
0

저는 CurrentUser, Theme 등의 '글로벌'멤버를 내 부분 에서뿐만 아니라 내 의견에서도 볼 수있는 좋은 방법을 찾으려고합니다.모델보기 (ViewData), UserControls/Partials 및 전역 변수 - 모범 사례?

(BL.CurrentUser와 같은)이 데이터를 반환 할 수있는 논리 클래스를 갖고 싶지 않습니다. 내 뷰에서 Model의 일부가되어야한다고 생각합니다. 따라서이 멤버들과 함께 BaseViewData를 상속하려고했습니다. 내 컨트롤러에서,이 방법 또는 다른 방법 (필터 또는 내 BaseController 기본 메서드) 상속 클래스의 인스턴스를 만들고보기 데이터로 전달합니다. 이 시점까지 모든 것이 완벽하기 때문에 기본 뷰에서 기본 뷰에서 내 뷰 데이터를 사용할 수 있습니다. 그러나 부분적인 부분은 어떨까요? (그 model.Posts이 IEnumerable<Post>입니다) 내보기에이 부분을 렌더링하는

<%@ Control Language="C#" AutoEventWireup="true" Inherits="ViewUserControl<Post>" %> 

및 간단한 코드 : 나는 블로그 게시물을 표시 할 필요가있는 간단한 부분이있는 경우

은 다음은 다음과 같습니다 : 의 부분 모델 BaseViewData하지 않기 때문에

<%foreach (Post p in this.Model.Posts) {%> 
    <%Html.RenderPartial("Post",p); %> 
<%}%> 

, 나는 그 속성에 액세스 할 수 없습니다. 따라서, 나는 BaseViewData에서 상속 PostViewData라는 이름의 클래스를 만들기 위해 노력했다,하지만 내 포함 된 뷰는 실제로 부분에 전달하기 위해 그들에 PostViewData을 만들 수있는 코드가됩니다

<%Html.RenderPartial("Post",new PostViewData { Post=p,CurrentUser=Model.CurrentUser,... }); %> 

또는 내가 할 수를 복사 생성자 사용

<%Html.RenderPartial("Post",new PostViewData(Model) { Post=p }); %> 

다음 단계로 넘어 가기 전에 구현할 다른 방법이 있는지 궁금합니다.

제안 사항?

감사합니다.

답변

0

세션에서 이러한 내용을 유지하고 세션에 강력한 형식의 래퍼를 작성하여이 정보에 액세스 할 수있는 방법을 고려 했습니까? 그런 다음 모든보기에서 ViewPage (또는 ViewUserControl의) Session 속성을 사용하여 새 래퍼 클래스를 만들고이를 사용할 수 있습니다.

+0

오랫동안 서버에 저장 되었기 때문에 Session이 솔루션이라고 생각하지 않지만 HttpContext.Current.Items를 사용하여 거기서부터 데이터를 검색하도록 새로운 방향을 제시했습니다. . 액션이 초기에 ViewData를 준비하면 BaseViewData는 HttpContext.Current.Items (BaseViewData 설정자 사용)에 데이터를 저장하고 다른 부분 데이터가 HttpContext.Current.Items (BaseViewData getters 사용)에서 읽을 속성을 액세스 할 때, . 더 나은 해결책을 찾고 있지만이 방법이 더 좋을 수도 있습니다. 감사합니다. – elado

+1

예 : 현재 사용자, 테마 - 전체 세션을 유지하기에 좋은 후보자처럼 보입니다. 이 곰팡이에 맞지 않는 다른 "글로벌"속성이 있습니까? – tvanfosson