How can I set a variable on a _Layout page?

asp.net-mvc, asp.net-mvc-3, razor

Solution

I'm with you, Exitos: I avoid using `ViewBag` too. Aside from the silly name, I dislike the weak typing that comes along with it. There is a solution, but it's kind of involved, so bear with me.

First, create a class to store the "display hints" that are to be passed to the layout. I creatively call this class "DisplayHints":

public class DisplayHints {
  // anything that you want passed from a view to the layout goes here
  public bool ShowBanner { get; set; }
}

Then, create a class deriving from `WebViewPage<T>` that will be the new base class of your views. Note how we have a property called `DisplayHints` that's stored in `ViewData` (which is available to the controller, the view, and the layout):

public abstract class MyViewPage<T> : WebViewPage<T> {
  public DisplayHints DisplayHints {
    get {
      if( !ViewData.ContainsKey("DisplayHints") )
        ViewData["DisplayHints"] = new DisplayHints();
      return (DisplayHints)ViewData["DisplayHints"];
    }
  }
}

As a commenter pointed out below, `ViewData` is weakly-typed, just like `ViewBag`. However, there's no way I know of to avoid storing something in `ViewData`/`ViewBag`; this just minimizes the number of weakly-typed variables to one. Once you've done this, you can store as much strongly-typed information in `DisplayHints` as you want.

Now that you have a base class for your views, in `Web.config`, we need to tell MVC to use your custom base class:

<pages pageBaseType="MyNamespace.Views.MyViewPage">

It sounds like a lot of trouble, but you gain some serious functionality for all this work. Now in your view, you can set any display hint you want as follows:

@{ DisplayHints.ShowBanner = true; }

And in your layout, you can access it just as easily:

@if( DisplayHints.ShowBanner ) {
  <div>My banner....</div>
}

I hope this helps!

Problem

I have a view and I want to use a layout page. In the layout page I want to have a conditional banner which some of the view will turn on/off. Just wondering how I can do this? I have this in the _Layout.cshtml page... ``` @if (ShowBanner){ <h1>banner</h1> } ``` I'm wondering how I can turn this on/off from my MVC View page? Or whether this is the right thing to do at all? I mean if I declare that variable in the View page surely the master doesn't know about it? How do the two communicate through c#? Do I use the Viewbag? Rather not. I know with forms its all about referencing the Page or Master member, just cant quite seem to see it with MVC... Any help much appreciated... Thanks Pete

Original source