如何为 _Layout.cshtml 设置 ViewBag 属性

Asi*_*raz 3 c# asp.net-mvc razor asp.net-mvc-4

我正在尝试传递一个 ViewBag 属性来自定义 _Layout.cshtml 中的 html。

@Styles.Render(ViewBag.IsEnglish ? "~/Content/css-en" : "~/Content/css-ur")
Run Code Online (Sandbox Code Playgroud)

为此,我的基本控制器中有代码

public class BaseController : Controller
{
    protected virtual void OnAuthorization(AuthorizationContext filterContext)
    {
        ViewBag.IsEnglish = Request.RequestContext.RouteData.Values.ContainsKey("Culture") ?
            (Request.RequestContext.RouteData.Values["culture"].ToString().ToLower() == "en")
            : true;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我的 _Layout.cshtml 在调用 ViewBag 的地方给出了错误,在控制器的代码设置该属性之前。我认为 _Layout 是由 ViewEngine 执行的,而 ViewEngine 在 Controllers 运行后运行。我应该在哪里放置我的 ViewBag 初始化代码,以便 _Layout.cshtml 可以使用它?

jao*_*jao 5

在您的基本控制器中,试试这个:

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);

    ViewBag.IsEnglish = requestContext.RouteData.Values.ContainsKey("Culture") ?
        (requestContext.RouteData.Values["culture"].ToString().ToLower() == "en") : true;

}
Run Code Online (Sandbox Code Playgroud)

我假设你想默认为英语。如果不是这种情况,请更改: true;: false;

另请参阅MSDN 上的Controller.Initialize 方法