我正在尝试传递一个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?
答案 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