C# PageData值在部分视图内返回null

C# PageData值在部分视图内返回null,c#,asp.net-mvc,C#,Asp.net Mvc,我在\u ViewStart.cshtml中有此代码: @{ Layout = "~/Views/Shared/_Layout.cshtml"; var cultureRoute = ViewContext.RouteData.Values["lang"].ToString(); PageData["culture"] = new System.Globalization.CultureInfo(cultureRoute); } 并且在我的视图中检索文化时没有任何问题

我在
\u ViewStart.cshtml
中有此代码:

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

    var cultureRoute = ViewContext.RouteData.Values["lang"].ToString();
    PageData["culture"] = new System.Globalization.CultureInfo(cultureRoute);
}
并且在我的视图中检索
文化
时没有任何问题,包括页面顶部的部分
\u布局
视图:

@{ 
    var culture = @PageData["culture"];
}
但是,在创建一个新的局部视图后,
\u导航栏
,当使用从insde
\u布局
调用它时,完全相同的代码段将
区域性
分配给
空值

@Html.Partial("_Navbar")

为什么该
PageData
变量不再可用?

PageData
PageContext
的一部分。Razor呈现视图时,会自动将其与
\u ViewStart
页面和布局页面组合。执行此操作时,它会传递
PageContext
,以便相同的
PageData
可用于所有3个视图

不幸的是,当它进入部分视图时,
Html.partial/RenderPartial
都使用
HtmlHelper
工作,它只传递一个模型(可以通过显式提供第二个参数替换)和
ViewData
作为
ViewContext
的一部分。这就是为什么局部视图从呈现它们的视图中看不到页面数据的原因

如果要使区域性在局部视图中可用,可以将其放入
ViewData
中。这里唯一的怪癖是,虽然它在视图、布局和部分页面中作为属性提供,但在
\u 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"];
}

这有一些关于Razor在呈现页面时如何使用
PageContext
的详细信息。
PageData
PageContext
的一部分。Razor呈现视图时,会自动将其与
\u ViewStart
页面和布局页面组合。执行此操作时,它会传递
PageContext
,以便相同的
PageData
可用于所有3个视图

不幸的是,当它进入部分视图时,
Html.partial/RenderPartial
都使用
HtmlHelper
工作,它只传递一个模型(可以通过显式提供第二个参数替换)和
ViewData
作为
ViewContext
的一部分。这就是为什么局部视图从呈现它们的视图中看不到页面数据的原因

如果要使区域性在局部视图中可用,可以将其放入
ViewData
中。这里唯一的怪癖是,虽然它在视图、布局和部分页面中作为属性提供,但在
\u 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"];
}
本文提供了Razor在呈现页面时如何使用
PageContext
的更多详细信息