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" })
The file MasterLayout. cshtml represents the layout of each page in the application. Right-click on the Shared folder in the Solution Explorer, then go to Add item and click View. Copy the following layout code.
We can also create multiple _ViewStart. cshtml pages. The file execution is dependent upon the location of the file within the folder hierarchy and the view being rendered. The MVC Runtime will first execute the code of the _ViewStart.
cshtml in the Views folder sets the Layout property to "~/Views/Shared/_Layout. cshtml" .
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With