11

I am working on a dynamic menu system for MVC and just to make it work, I created a partial view for the menu and it works great using the syntax below:

@Html.RenderPartial("_Menu", (Models.Menu)ViewBag.MainMenu)

BUT, to do so, I would have to set the MainMenu and FooterMenu (or any other menu for that matter) in the ViewBag on each Controller and each action. To avoid this, I was wondering if there was a recommended event that I could access the ViewBag globally. If not, does anyone recommend passing the Menu object into a session variable? It doesn't sound right to me, but only thing I can think of right now.

UPDATE:

_Layout.cshtml - I included the new call to Action:

@Html.Action("RenderMenu", "SharedController", new { name = "Main" })

SharedController.cs - Added New Action:

public ActionResult RenderMenu(string name)
{
    if (db.Menus.Count<Menu>() > 0 && db.MenuItems.Count<MenuItem>() > 0)
    {
        Menu menu = db.Menus.Include("MenuItems").Single<Menu>(m => m.Name == name);
        return PartialView("_MenuLayout", menu);
    }
    else
    {
        return PartialView("_MenuLayout", null);
    }
}

And it throws the following exception:

The controller for path '/' was not found or does not implement IController.

UPDATE 2:

So, the issue is that I referenced the Controller by the full name and you only need the name of the controller minus "Controller". Neat tidbit. So, for my example, this works:

@Html.Action("RenderMenu", "Shared", new { name = "Main" })

1 Answer 1

6

set your menu up as an action then call it in your master layout.

use @Html.Action()

the action can return a partial view with your menu code in it.

Sign up to request clarification or add additional context in comments.

3 Comments

wow, I knew it was something simple, but didn't know all of the ins-and-outs of MVC yet. Thanks so much Matt!
Nevermind...so sorry, I updated my code yet again. The problem was that I was including the full name of the controller when I only needed "Shared"
you have SharedController in the action, should it be My

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.