2017-09-14 92 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在渲染页面的更多细节。