2014-05-16 1 views
0

부모와 자식보기간에 통신 할 수있는 HtmlHelper를 만들려고합니다. 나는 여기로부터 튜토리얼을 가지고있다 : https://gist.github.com/primaryobjects/8442193. 부모 뷰에서내 ViewContext.ViewBag를 내 코드와 함께 사용하려면 어떻게해야합니까?

@using SchoolIn.Helpers 

@{Html.GetPageViewBag().PageTitle = "My Custom Property Readable By Parent View"; } 

: 나는 사용하여 문을 추가 아이 뷰에서

namespace SchoolIn.Helpers 
    { 
    public static class ViewBagHelpers 
    { 

    public static dynamic GetPageViewBag(this HtmlHelper html) 
    { 
     if (html == null || html.ViewContext == null) //this means that the page is root or parial view 
     { 
      return html.ViewData; 
     } 

     ControllerBase controller = html.ViewContext.Controller; 

     while (controller.ControllerContext.IsChildAction) //traverse hierachy to get root controller 
     { 
      controller = controller.ControllerContext.ParentActionViewContext.Controller; 
     } 

      return controller.ViewBag; 
     } 



    } 
} 

:

는 우선이 같은 클래스와 메소드를 생성 나는 이것을하려고 노력하고있다 :

@{ ViewBag.Title = ViewContext.ViewBag.PageTitle } 

그래서 나는 두 가지 문제가 있다고 생각합니다. 첫 번째는

ViewContex.ViewBag. 

어떤 생각 나는이 일을 할 수있는 방법 ... 내가 튜토리얼처럼 내가 할 수없는 부모 뷰에서 html.ViewBag에 액세스 할 수 없습니다입니까? 어떤 도움을 주셔서 감사합니다.

+0

입니다 보기? 이 작업을 수행해야하거나 레이아웃 /보기/부분/모델을 설계하는 더 좋은 방법이있을 수 있습니까? – Dangerous

답변

0

나는 두어 번의 조정을 통해 작동시킬 수 있었다. 구문이 정확하고 부분이 렌더링 된 후에 제목이 설정되어 있는지 확인하십시오.

레이아웃 페이지 (_Layout.cshtml) :

@using SchoolIn.Helpers 

@* Nb. The example did not include the call to partial. *@ 
@Html.Partial("_Child") 

@* The following line must appear after the partial is rendered for the ViewBag to have been set. *@ 
@* Nb. The example was missing the semicolon. *@ 
@{ ViewBag.Title = ViewContext.ViewBag.PageTitle; } 

부분보기 (_Child.cshtml) : 당신이에 대한 부분에서 다시 전달하기 위해 노력하고 있다는 것이 무엇

@using SchoolIn.Helpers 

@{Html.GetPageViewBag().PageTitle = "My Custom Property Readable By Parent View"; } 
+0

오류 메시지가 없지만 제목이 표시되지 않습니다. 헬퍼 파일과 뷰에서 .ViewContext.Controller.ViewBag라는 ViewBag 속성에 액세스하려면이 작업을 수행해야한다는 것을 알았습니다. 또한 @Ajax.ActionLink()를 사용하여 부분 뷰를 호출합니다. 이것이 무엇과도 관련이 있는지 궁금합니다. – CloudyKooper

+0

Ajax를 사용하고 있다는 질문에 대해서는 언급하지 않았지만 Ajax를 사용하는 경우 제목을 설정하는이 메서드는 작동하지 않습니다. 사용하는 메서드는 서버 측에서만 사용할 수있는 ViewBag의 제목을 설정합니다. 뷰가 브라우저로 보내지면 더 이상 ViewBag에 액세스 할 수 없으므로 메서드를 사용하여 제목을 설정할 수 없습니다. – Dangerous

+0

Ajax를 사용하여 부분을 검색하는 경우 [제목을 변경하려면 JavaScript] (http://stackoverflow.com/questions/413439/how-to-dynamically-change-a-web-pages-title)를 사용할 수 있습니다. SEO 목적으로 권장되지는 않지만 페이지가 검색 될 때 – Dangerous

관련 문제