Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ASP.Net MVC Controller for _Layout

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" })
like image 592
clockwiseq Avatar asked Feb 22 '14 02:02

clockwiseq


People also ask

What is the use of _layout Cshtml in MVC?

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.

Can we have multiple _ViewStart in MVC?

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.

Where is _layout Cshtml?

cshtml in the Views folder sets the Layout property to "~/Views/Shared/_Layout. cshtml" .


1 Answers

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.

like image 52
Matt Tabor Avatar answered Oct 05 '22 20:10

Matt Tabor