我在_ViewStart.cshtml
中有这段代码:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
var cultureRoute = ViewContext.RouteData.Values["lang"].ToString();
PageData["culture"] = new System.Globalization.CultureInfo(cultureRoute);
}
在我的观看中检索culture
没有任何问题,包括页面顶部的部分_Layout
视图:
@{
var culture = @PageData["culture"];
}
但是,在创建新的部分视图_Navbar
后,从insde culture
调用<{1}}时,完全相同的代码会将null
分配给_Layout
>
@Html.Partial("_Navbar")
为什么PageData
变量不再可用?
答案 0 :(得分:2)
PageData
是PageContext
的一部分。当Razor呈现视图时,它会自动将其与_ViewStart
页面和布局页面组合在一起。虽然它执行此操作,但它会传递PageContext
左右,因此所有3个视图都可以使用相同的PageData
。
不幸的是,当它到达部分视图时,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详细介绍了Razor在呈现网页时如何使用PageContext
。