2012-04-10 6 views
11

보기가 있는데 레이아웃 페이지를 사용하고 싶습니다. 레이아웃 페이지에서 뷰의 일부가 켜지거나 꺼지는 조건부 배너가 필요합니다. 내가 어떻게이 일을 할 수 있을지 궁금해? 난 내 MVC보기 페이지에서 온/오프에서이를 설정하는 방법을 나는 _Layout.cshtml 페이지에서 이것을 가지고_Layout 페이지에서 어떻게 변수를 설정할 수 있습니까?

...

@if (ShowBanner){ 

    <h1>banner</h1> 

} 

을 궁금하네요? 아니면 이것이 옳은 일인지 아닌지. 내가보기 페이지에서 그 변수를 반드시 마스터가 그것에 대해 알지 못한다고 선언한다면? 어떻게 두 사람이 C#을 통해 통신합니까? Viewbag를 사용합니까? 오히려.

나는 형태의 알의 모든 페이지 또는 마스터 멤버를 참조에 대해, 단지 캔트 꽤 피트

를 ... MVC로 볼

많은 감사 어떤 도움 ...

감사 보인다

답변

12

을 Exitos을 : 나는 너무 ViewBag을 사용하지 마십시오. 바보 같은 이름을 제외하고 나는 그와 함께 오는 약한 타이핑을 싫어한다. 해결책이 있지만 일종의 것이므로 나와 함께 감내하십시오.

먼저 레이아웃에 전달할 "디스플레이 힌트"를 저장할 클래스를 만듭니다. 그런 다음

public class DisplayHints { 
    // anything that you want passed from a view to the layout goes here 
    public bool ShowBanner { get; set; } 
} 

를 귀하의 의견의 새로운 기본 클래스 될 것 WebViewPage<T>에서 클래스의 유도를 만들 : 나는 창조적이 클래스 "DisplayHints"를 호출합니다. 우리가 ViewData에 저장된 DisplayHints라는 속성이 (컨트롤러, 뷰에 사용할 수 있으며, 레이아웃)하는 방법을 참고 :

public abstract class MyViewPage<T> : WebViewPage<T> { 
    public DisplayHints DisplayHints { 
    get { 
     if(!ViewData.ContainsKey("DisplayHints")) 
     ViewData["DisplayHints"] = new DisplayHints(); 
     return (DisplayHints)ViewData["DisplayHints"]; 
    } 
    } 
} 

주석 기 아래에 지적한 바와 같이, ViewData이처럼 약한 타입입니다 ViewBag. 그러나, 저장을 피할 수있는 방법이 없습니다. ViewData/ViewBag; 이것은 약형 변수의 수를 1로 최소화합니다. 이 작업을 완료하면 원하는만큼 강력한 형식의 정보를 DisplayHints에 저장할 수 있습니다.이제 귀하의 의견에 대한 기본 클래스를 가지고

Web.config, 우리는 사용자 정의 기본 클래스를 사용하는 MVC 말할 필요 :

<pages pageBaseType="MyNamespace.Views.MyViewPage"> 

그것은 많은 문제처럼 들리 겠지만, 당신은 몇 가지 심각한을 얻을 이 모든 작업을위한 기능.

@{ DisplayHints.ShowBanner = true; } 

을 그리고 레이아웃에, 당신은 쉽게 액세스 할 수 있습니다 : : 이제 다음과 같이보기에, 당신은 당신이 원하는 디스플레이 힌트를 설정할 수 있습니다

@if(DisplayHints.ShowBanner) { 
    <div>My banner....</div> 
} 

을 나는 희망이 도움이!

+0

흥미 롭지 만 ViewData는 여전히 ViewBag와 동일한 약점 타이핑 문제가 있으며, 거기에 도달하는 데 더 많은 어려움을 겪었습니다. – Maess

+0

나는이 솔루션을 좋아한다. 그리고 나는 "WebViewPage"를 확장하는 것이 "더 많은 문제"라고 생각하지 않는다. – MilkyWayJoe

+0

Maess, 네,'ViewData'는'ViewBag'와 같은 약한 타이핑 이슈가 있습니다. 그러나 표시 힌트를 약하게 입력 된 변수로 저장하는 대신 하나의 객체 만 저장하면 더 복잡한 구조를 포함하여 원하는만큼 강하게 입력 할 수 있습니다. 내 응용 프로그램에서는 해당 DisplayHints 클래스가 20 개 이상의 멤버를 포함하고 있습니다. 모두 강력한 형식입니다. –

3

레이아웃에 대한 모델을 갖는 것은 모든 뷰가 해당 모델을 사용하도록하므로 바람직하지 않습니다. 그러나, 당신은 ViewBag에 그 타입의 정보를 넣을 수 있고 당신의 컨트롤러베이스 중 하나의 생성자에 값을 채울 수 있습니다. 이 같은

+1

항상 변수를 ViewBag에 넣는 기본 컨트롤러를 가질 수도 있습니다. – Joe

+0

물론 OP가 항상 동일한 컨트롤러 기반을 사용하는지는 확실하지 않았습니다. – Maess

+0

변수를 뷰백에 넣을 수 있다면 컨트롤러에 강력하게 입력 할 수없는 이유는 무엇입니까? – liang

-1

시도 뭔가 :

컨트롤러에

var yourVariable; 
// other stuff and eventually fill the 'yourVariable' variable 
ViewBag.YourVariable = yourVariable; 

다음보기에 당신은 당신의 레이아웃에 섹션을 정의 할 수 있습니다, 그리고보기 책임이 다음 경우

@if (ViewBag.YourVariable){ 

    <!-- Your markup --> 

} 
관련 문제