Why can't _ViewStart.cshtml access the ViewBag object?

前端 未结 6 1736
孤街浪徒
孤街浪徒 2020-12-30 19:12

I have the default _ViewStart.cshtml in my /Views folder. I\'d like to be able to access my ViewBag object so I can set the default title for all my views.

However,

相关标签:
6条回答
  • 2020-12-30 19:43

    In short... Use the controller's view bag.

    ViewContext.Controller.ViewBag.MyVar = "myVal";
    

    and

    @ViewContext.Controller.ViewBag.MyVar
    

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

    There is good information here: http://forums.asp.net/post/4254825.aspx

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

    Generally, ViewData["StoreName"] is same as ViewBag.StoreName

    Also, Controller.ViewData["StoreName"] = Controller.StoreName = ViewContext.Controller.ViewBag.StoreName =ViewContext.Controller.ViewData["StoreName"]

    But every view and partial view gets its own instance of viewdata.

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

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

    There is a another solution here: https://stackoverflow.com/a/4834382/291753

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

    0 讨论(0)
  • 2020-12-30 19:54

    hmm, you can access ViewBag via ViewData, e.g. ViewContext.ViewData["Title"].

    So if you set ViewBag data in an action filter for example, you can pull it out from _ViewStart.cshtml using ViewContext.ViewData["Title"].

    But I tried to assign a value using ViewContext.ViewData["Key"] = value; and it doesn't seem to persist to the actual view.

    0 讨论(0)
  • 2020-12-30 19:54

    You can achieve this using Partial views. Put all your Title related common code in a Partial View called Title.cshtml in the shared folder. In the _viewstart simply call the Partial view.

    _ViewStart.cshtml:

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

    ~/Shared/Title.cshtml:

    @{
     ViewBag.Title = "bytecourse - Online Courses in Technology"; 
    }
    
    0 讨论(0)
  • 2020-12-30 19:54

    You could use sections in your _Layout if you want to set a default title:

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

    and inside views you could override it:

    @section Title {
        Overriden title
    }
    

    One more reason not to use ViewBag :-)

    0 讨论(0)
  • 2020-12-30 19:54

    You can create one layout page which is using your Viewbag data and add layout to your blank _ViewStart page it will work

    on ViewStart.cshtml

    @{
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    0 讨论(0)
  • 2020-12-30 20:03

    Its not 100% clean but see a workaround using PageData or a bit of enumeration at:

    How do I set ViewBag properties on _ViewStart.cshtml?

    0 讨论(0)
提交回复
热议问题