我的/ Views文件夹中有默认的_ViewStart.cshtml。我希望能够访问我的ViewBag对象,以便为所有视图设置默认标题。
但是,用:
@{
Layout = "~/Views/Shared/SiteLayout.cshtml";
ViewBag.Title = "bytecourse - Online Courses in Technology";
}
我得到“名称'ViewBag'在当前上下文中不存在”作为运行时错误。
我需要做什么?
答案 0 :(得分:42)
简而言之......使用控制器的视图包。
ViewContext.Controller.ViewBag.MyVar = "myVal";
和
@ViewContext.Controller.ViewBag.MyVar
=============================================== ================
这里有很好的信息:http://forums.asp.net/post/4254825.aspx
=============================================== ================
通常,ViewData [“StoreName”]与ViewBag.StoreName
相同另外,Controller.ViewData [“StoreName”] = Controller.StoreName = ViewContext.Controller.ViewBag.StoreName = ViewContext.Controller.ViewData [ “STORENAME”]
但是每个视图和部分视图都有自己的viewdata实例。
=============================================== ================
此处还有另一种解决方案:https://stackoverflow.com/a/4834382/291753
=============================================== ================
答案 1 :(得分:3)
ViewContext.ViewData["Title"]
。
因此,如果您在动作过滤器中设置ViewBag数据,则可以使用ViewContext.ViewData["Title"]
从_ViewStart.cshtml中将其拉出。
但我尝试使用ViewContext.ViewData["Key"] = value;
分配一个值,但它似乎不会持续到实际视图。
答案 2 :(得分:3)
您可以使用部分视图来实现此目的。将所有与标题相关的公共代码放在共享文件夹中名为Title.cshtml
的部分视图中。在_viewstart
中只需调用部分视图。
<强> _ViewStart.cshtml 强>:
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@Html.Partial("Title")
<强>〜/共享/ Title.cshtml 强>:
@{
ViewBag.Title = "bytecourse - Online Courses in Technology";
}
答案 3 :(得分:2)
如果要设置默认标题,可以使用_Layout中的部分:
<title>
@if (IsSectionDefined("Title"))
{
@RenderSection("Title")
}
else
{
@:bytecourse - Online Courses in Technology
}
</title>
和内部视图可以覆盖它:
@section Title {
Overriden title
}
不使用ViewBag
的另一个原因: - )
答案 4 :(得分:0)
它不是100%干净但是在以下位置使用PageData或一些枚举来查看解决方法:
答案 5 :(得分:0)
您可以创建一个使用Viewbag数据的布局页面,并将布局添加到空白的_ViewStart页面中
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}