如何为_Layout.cshtml设置ViewBag属性

时间:2014-03-18 07:31:03

标签: c# asp.net-mvc asp.net-mvc-4 razor

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

@Styles.Render(ViewBag.IsEnglish ? "~/Content/css-en" : "~/Content/css-ur")

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

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;
    }
}

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

2 个答案:

答案 0 :(得分:4)

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

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;

}

我假设您要默认为英语。如果情况并非如此,请将: true;更改为: false;

另请参阅MSDN上的Controller.Initialize method

答案 1 :(得分:-2)

尝试使用Action上的Viewbag返回使用_Layout.cshtml

的View