2011-07-05 8 views
29

내/Views 폴더에 기본 _ViewStart.cshtml이 있습니다. 내 모든보기에 기본 제목을 설정할 수 있도록 내 ViewBag 개체에 액세스 할 수 있어야합니다. 와 그러나_ViewStart.cshtml에서 ViewBag 객체에 액세스 할 수없는 이유는 무엇입니까?

는 :

@{ 
    Layout = "~/Views/Shared/SiteLayout.cshtml"; 
    ViewBag.Title = "bytecourse - Online Courses in Technology"; 
} 

내가 할 런타임 오류로 '이름'ViewBag '는 현재 컨텍스트에 존재하지 않습니다. "

무엇을해야합니까?

답변

40

요컨대 ... 컨트롤러의 뷰 백을 사용하십시오.

ViewContext.Controller.ViewBag.MyVar = "myVal"; 

@ViewContext.Controller.ViewBag.MyVar 

=================================== ============================

좋은 정보가 여기에 있습니다 : http://forums.asp.net/post/4254825.aspx

======= ========================================================================================================== ======

,

일반적을 ViewData [ "StoreName이는"] ViewBag.StoreName와 동일

또한

, Controller.ViewData [ "StoreName이"= Controller.StoreName = ViewContext.Controller.ViewBag.StoreName = ViewContext.Controller.ViewData [ "StoreName"]

그러나 모든보기 및 부분보기에는 자체의보기 데이터 인스턴스가 있습니다.

http://jeffreypalermo.com/blog/viewdata-mechanics-and-segmentation-excerpt-from-asp.net-mvc-in-action/

======================================= ========== https://stackoverflow.com/a/4834382/291753

: ========================

는 여기에 다른 해결책이있다 ========================================================================================================== ===

2
당신이 기본 제목 설정하려는 경우 당신은 당신의 _Layout의 섹션을 사용할 수

:

<title> 
    @if (IsSectionDefined("Title")) 
    { 
     @RenderSection("Title") 
    } 
    else 
    { 
     @:bytecourse - Online Courses in Technology 
    } 
</title> 

내부 전경 당신이 그것을 무시할 수 : ViewBag를 사용하지

@section Title { 
    Overriden title 
} 

또 하나의 이유 : -)

+1

안녕하세요 @Darin Dimitrov는 사용되지 않습니다. @RenderSection ("Title")은'@RenderSection ("Title", required : = false)'사용됩니다. 필요한 경우 IsSectionDefined ("제목") ?? –

+0

@BeratBilgin 해당 섹션이 뷰에 의해 정의되지 않은 경우 기본값을 원한다면 선택합니다. –

3

흠, ViewData를 통해 ViewBag에 액세스 할 수 있습니다. ViewContext.ViewData["Title"].

예를 들어 작업 필터에서 ViewBag 데이터를 설정하면 ViewContext.ViewData["Title"]을 사용하여 _ViewStart.cshtml에서 가져올 수 있습니다.

그러나 ViewContext.ViewData["Key"] = value;을 사용하여 값을 지정하려고 시도했지만 실제보기에는 유지되지 않습니다.

2

부분 뷰를 사용하여이를 수행 할 수 있습니다. 공유 폴더에 Title.cshtml이라는 부분보기에 모든 관련 타이틀을 기재하십시오. _viewstart에서 부분 뷰를 호출하기 만하면됩니다.

_ViewStart.cshtml :

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
@Html.Partial("Title") 

~/공유/Title.cshtml :

@{ 
ViewBag.Title = "bytecourse - Online Courses in Technology"; 
} 
+0

내 mvc5 프로젝트에서 부분 뷰의 ViewBag 값을 주 뷰에서 액세스 할 수 없습니다. ViewData와 동일한 문제가 발생했습니다. 레이아웃 페이지에 직접 부분을 렌더링하더라도 – Alexus1024

0

당신은 당신의 Viewbag 데이터를 사용하여 하나의 레이아웃 페이지를 만들고에 레이아웃을 추가 할 수 있습니다 비어있는 빈 _ViewStart 페이지

on ViewStart.cshtml

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 
관련 문제