ASP.Net MVC Controller for _Layout
asp.net-mvc, menu, partial-views
Solution
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.
Problem
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" }) ```