PageData值在局部视图中返回null

时间:2017-09-14 07:32:46

标签: c# asp.net-mvc

我在_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变量不再可用?

1 个答案:

答案 0 :(得分:2)

PageDataPageContext的一部分。当Razor呈现视图时,它会自动将其与_ViewStart页面和布局页面组合在一起。虽然它执行此操作,但它会传递PageContext左右,因此所有3个视图都可以使用相同的PageData

不幸的是,当它到达部分视图时,Html.Partial/RenderPartial都使用HtmlHelper只能传递模型(可以通过显式提供第二个参数替换)和ViewDataViewContext的一部分。这就是为什么部分视图永远不会从呈现它们的视图中看到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