2017-09-14 48 views
0

我有這樣的代碼在_ViewStart.cshtmlPageData值局部視圖內返回null

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 

    var cultureRoute = ViewContext.RouteData.Values["lang"].ToString(); 
    PageData["culture"] = new System.Globalization.CultureInfo(cultureRoute); 
} 

而且沒有檢索我的意見,其中包括部分_Layout觀點與此頁面的頂部culture任何問題:

@{ 
    var culture = @PageData["culture"]; 
} 

然而,創建一個新的局部視圖,_Navbar後,完全相同的一段代碼從insde調用它時分配給culture

@Html.Partial("_Navbar") 

這是爲什麼PageData變量不再可用?

回答

0

PageDataPageContext的一部分。當Razor渲染一個視圖時,它會自動將它與_ViewStart頁面和一個佈局頁面結合在一起。雖然它這樣做,它通過PageContext左右,所有相同的PageData可用於所有3個視圖。

不幸的是,當它到達局部視圖,所述Html.Partial/RenderPartial都工作使用HtmlHelper其中僅通過一種模式和ViewData這是ViewContext部分(其可以通過顯式地提供的第二個參數被替換)。這就是爲什麼部分視圖永遠不會從呈現它們的視圖中看到PageData。

如果您想在部分視圖中顯示文化,您可以改爲將其放入ViewData。這裏唯一的怪癖是,雖然它可以作爲內部的意見,佈局和部分頁面的屬性,在_ViewStart頁面,您必須通過ViewContext屬性來訪問它:

@{ 
    Layout = "~/Views/Shared/_Layout.cshtml"; 

    var cultureRoute = ViewContext.RouteData.Values["lang"].ToString(); 
    ViewContext.ViewData["culture"] = new System.Globalization.CultureInfo(cultureRoute); 
} 

然後,只需使用的ViewData,而不是PageData其他地方:

@{ 
    var culture = ViewData["culture"]; 
} 

blog post對剃刀如何使用PageContext在渲染頁面的更多細節。