2013-05-17 4 views
3

정말 간단한 질문입니다.RenderBody의 ViewBag가 전달됩니까?

내 레이아웃 페이지는

@{ 
    ViewBag.IsInternal = false; 
} 

같은 부분 외모는 내가이 일을해야 무슨 생각을하고있다

@RenderBody() 
@{ 
    if (ViewBag.IsInternal) 
    { 
    //do something here 
    } 
} 

처럼 보인다? 기본적으로 ViewBag.IsInternal이 부분적으로 설정된 경우 레이아웃에서 해당 설정 값을 읽을 수 있습니다.

+0

로 설정합니다. 내 생각에 다음 요청까지 지속될 것 같습니다. – valverij

+0

또한, [이 질문에] (http://stackoverflow.com/questions/7993263/viewbag-viewdata-and-tempdata)'ViewBag' 그냥'ViewData' 주위에 동적 래퍼, 그래서 이론적으로, 당신은 어디서나 'ViewData', 당신은'Viewbag'를 가지고 있어야합니다 – valverij

답변

1

아니요 부분보기에 자체 ViewBag가 없으므로 수정해도 레이아웃 클래스의 ViewBag에는 영향을주지 않습니다.

그러나 부분보기로 참조로 전달하고 레이아웃 ViewBag를 부분적으로 수정할 수 있습니다. 예 :

@{ 
    var layoutViewBag = ((dynamic)ViewData["LayoutViewBag"]); 
    layoutViewBag.IsInternal = true; 
} 
+0

고마워요! 이것은 의미가 있습니다. 나는 그들이 한 페이지에 표시 되었기 때문에 관련 변수 공유가있을 것이라고 생각했지만 이것이 아닌 것으로 생각합니다. – kei

+0

후속 질문으로,'RenderPartial'을 사용하여, 특별히 partialview의 이름을 지정해야하지만, 레이아웃을 사용하여 부분 집합을 사용하고 있기 때문에 레이아웃에서 이름을 지정하고 싶지는 않습니다. 어떻게해야합니까? – kei

+0

사실, RenderSection 경로를 사용하여 Partial을 기반으로 섹션을 표시 할 수 있습니다. – kei

0

@{Html.RenderPartial("PartialView", Model, new ViewDataDictionary { {"LayoutViewBag", ViewBag}}); 

부분 레이아웃 당신은 '공유'ViewBag에 액세스 할 수 Html.ViewContext.Controller.ViewBag를 사용할 수 있습니다. 다음은 Pinterest 버튼을 사용한 경우에만 'Pinterest'자바 스크립트 (페이지 하단에 있음)를 포함하려는 예제입니다. 당신이 단지 주변에 임시 값을 전달해야하는 경우

if (Html.ViewContext.Controller.ViewBag.Pinterest == true) { <text> <script type="text/javascript" async defer src="//assets.pinterest.com/js/pinit.js"></script> </text> } 

그런 다음 물론 당신은`TempData`을 사용할 수,

Html.ViewContext.Controller.ViewBag.Pinterest = true; 
+0

공유 레이아웃을 사용하는 뷰에서 부분 뷰의 뷰백 값을 설정하고 해당 레이아웃에서 뷰백 값을 설정할 때 이것이 작동하지 않습니다. 중단 점을 사용하여 값을 읽기 전에 설정했지만 값이 손실되었음을 알았습니다. –

관련 문제