【问题标题】:Why can't _ViewStart.cshtml access the ViewBag object?为什么_ViewStart.cshtml 不能访问ViewBag 对象?
【发布时间】:2011-07-05 04:44:48
【问题描述】:

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

但是,与:

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

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

我需要做什么?

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案1】:

    总之...使用控制器的视图包。

    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

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

    【讨论】:

      【解决方案2】:

      hmm,您可以通过 ViewData 访问 ViewBag,例如ViewContext.ViewData["Title"]

      因此,例如,如果您在操作过滤器中设置 ViewBag 数据,您可以使用 ViewContext.ViewData["Title"] 从 _ViewStart.cshtml 中将其拉出。

      但我尝试使用 ViewContext.ViewData["Key"] = value; 分配一个值,但它似乎并没有持续到实际视图中。

      【讨论】:

        【解决方案3】:

        您可以使用局部视图来实现这一点。将所有与标题相关的公共代码放在共享文件夹中名为Title.cshtml 的部分视图中。在_viewstart 中只需调用部分视图。

        _ViewStart.cshtml

        @{
            Layout = "~/Views/Shared/_Layout.cshtml";
        }
        @Html.Partial("Title")
        

        ~/Shared/Title.cshtml

        @{
         ViewBag.Title = "bytecourse - Online Courses in Technology"; 
        }
        

        【讨论】:

        • 在我的 mvc5 项目中,无法从主视图访问部分视图的 ViewBag 值。 ViewData 也有同样的问题,即使我将部分内容直接渲染到布局页面中
        【解决方案4】:

        如果要设置默认标题,可以在 _Layout 中使用部分:

        <title>
            @if (IsSectionDefined("Title"))
            {
                @RenderSection("Title")
            }
            else
            {
                @:bytecourse - Online Courses in Technology
            }
        </title>
        

        您可以在内部视图中覆盖它:

        @section Title {
            Overriden title
        }
        

        不使用ViewBag 的另一个理由:-)

        【讨论】:

        • 嗨@Darin Dimitrov,不使用@RenderSection("Title") 使用@RenderSection("Title", required:=false) 以防万一,你有需要IsSectionDefined("Title") 吗??
        • @BeratBilgin 如果视图未定义该部分,则取决于您是否需要默认值。
        【解决方案5】:

        它不是 100% 干净的,但可以在以下位置查看使用 PageData 或一些枚举的解决方法:

        How do I set ViewBag properties on _ViewStart.cshtml?

        【讨论】:

          【解决方案6】:

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

          在 ViewStart.cshtml 上

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

          【讨论】:

            猜你喜欢
            • 2019-01-09
            • 2012-09-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-28
            • 1970-01-01
            • 2021-07-14
            • 1970-01-01
            相关资源
            最近更新 更多