2011-02-01 4 views
7

아주 단순한 개념 인 것처럼 보이는 데 어려움을 겪고 있습니다. 내 _Layout.cshtml에 의해 사용하기위한 ViewBag의 값이 있다면, 그 값을 어떻게 그리고 어디에서 설정해야합니까? 나는 현재를 참조로 여기 ASP.NET MVC 3보기에서 공통 데이터를 처리하기위한 접근 방식

옵션 (나에게) 가장 명백하다 :

  1. 각 컨트롤러 (DRY되지 않음)
  2. 는 컨트롤러에서 상속 내 자신의 컨트롤러 기반을 만들고 설정의 값을 설정 Global.asax.cs에 값을 설정 기본 클래스
  3. 가치
  4. 데이터를 설정하고 전역 필터를 등록하기 ActionFilter 생성 (더러운 느낌)
  5. 의 값을 설정 (도 잘못 느낌) 각 컨트롤러는 사용자 이름 값을 설정하면 그것은 정말 아니다,

    _Layout.cshtml


    <!DOCTYPE html> 
    <html> 
    <head runat="server"> 
        <title>@ViewBag.Title</title> 
    </head> 
    <body> 
        <div id="header"> 
         <h1>Welcome @ViewBag.UserName</h2> 
        </div> 
        <div id="content"> 
         @RenderBody() 
        </div> 
    </body> 
    </html> 
    

    : _ViewStart.cshtml 예를 들어

(매우 잘못하고 아주 더러운 느낌) 마른. CodeIgniter와 같은 작업으로이 문제를 해결했다면이 공통 항목을 처리하고 기쁜 방법으로 나만의 기본 컨트롤러를 만들 수있었습니다. ASP.NET MVC 3에서 더 선호되는 옵션이 있습니까?

+0

실제로이 특정 시나리오에서 "UserName"을 추측하는 것은 실제로 세션/양식 인증 티켓에서 오는 것입니다. 따라서 FormsAuth 코드를 사용하는 HTML 도우미를 사용하여 쿠키에서 Username을 가져 와서 MvcHtmlString을 렌더링하는 것이 좋습니다. – RPM1984

+0

흠 ... 좋은 지적입니다. 아마도 @ ViewBag.UserName이 가장 좋은 예가 아닙니다. 그래도 나는 지금 더 큰 그림에 더 관심이있다. – Greg

+0

@ RPM1984 :보기에 "사용자 이름"이 양식 승인에서 온 것이 중요하지 않습니다. 전달되어야합니다 (ViewBag 또는 기타). 뷰는 결코 "가져 오기"해서는 안됩니다. 테스트 시나리오를 고려해보십시오. 가짜 데이터를 유닛 테스트 뷰로 전달하려고합니다. 뷰가 "페치"하는 경우 가능하지 않습니다. 또한 MVC 패턴의 전체적인 점을 거의 무효화합니다. 당신을 선택하지는 않지만 방금 MVC 기사 (기본 MVC 프로젝트 템플릿 포함)에서 이러한 유형의 사고가 반복되는 것을 보았습니다. – Roger

답변

10

일반적인보기 모델과 기본 컨트롤러는 IMO로 이동하는 방법입니다. 공통 뷰 모델을 모든 뷰 모델의 기본 클래스로 사용하십시오. 기본 컨트롤러에서 OnActionExecuted 메서드를 사용하여 뷰 모델을 가져 와서 뷰를 반환하는 작업을 만들고 일반 뷰 모델로 캐스팅합니다. 그 당시 공통 속성을 설정하십시오.

+0

그루비. 나는 기지에서 완전히 벗어난 것이 아니라는 것을 알고 기쁘다. – Greg

+1

나는 Sith 거래를 절대적으로 알고 있지만 이것이 유일한 정답이다. 뷰는 모델에서 읽는 것으로 가정하고 컨트롤러 만 모델에 쓸 수 있습니다. 강력한 형식의 모델을 고수한다면 기본 모델과 기본 컨트롤러가 필요합니다. – Roger

+1

@tvanfossen. 이것은 흥미로운 접근법이며 나는 그것을 시도하는 현재입니다. 하나의 질문 - 기본 컨트롤러 대신 ActionFilter를 사용하고'OnActionExecuted'에 연결할 수 있습니까? 나는 일반적인 데이터를 전달할 필요가 있지만 특정 동작에만 의존해야하므로 필터가있는 사람들을 꾸미는 것이 좋을 것이라고 생각했습니다. –

0

ViewBag.PageHeight가 모든 페이지에 대해 기본값 1000을 갖도록하려는 경우 모든 페이지 /보기에 의해 무시되도록 허용한다고 가정 해 봅시다. 이것은 내가 _Layout.cshtml에 넣은 것입니다 :

페이지 높이가 @ (ViewBag.PageHeight ?? 1000)

이것은 작동하는 것 같습니다.

관련 문제