为什么_ViewStart.cshtml无法访问ViewBag对象?

时间:2011-07-05 04:44:49

标签: asp.net-mvc-3 razor

我的/ Views文件夹中有默认的_ViewStart.cshtml。我希望能够访问我的ViewBag对象,以便为所有视图设置默认标题。

但是,用:

@{
    Layout = "~/Views/Shared/SiteLayout.cshtml";
    ViewBag.Title = "bytecourse - Online Courses in Technology";
}

我得到“名称'ViewBag'在当前上下文中不存在”作为运行时错误。

我需要做什么?

6 个答案:

答案 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实例。

     

http://jeffreypalermo.com/blog/viewdata-mechanics-and-segmentation-excerpt-from-asp.net-mvc-in-action/

=============================================== ================

此处还有另一种解决方案:https://stackoverflow.com/a/4834382/291753

=============================================== ================

答案 1 :(得分:3)

嗯,您可以通过ViewData访问ViewBag,例如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或一些枚举来查看解决方法:

How do I set ViewBag properties on _ViewStart.cshtml?

答案 5 :(得分:0)

您可以创建一个使用Viewbag数据的布局页面,并将布局添加到空白的_ViewStart页面中

on ViewStart.cshtml

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}