Question

I wanted use MVC and renderpartial to generate a menu but but could not get it to work, and from what I read it seemed maybe RenderAction would be more suitable. Still I have not gotten it to work.

What I intended to do was create a controller that selects certain articles from a database that will act as categories (this is put into HomeController):

public ActionResult MenuController()
    {
        var movies = from m in db.Art
                     where m.ArtikelNr.StartsWith("Webcat")
                     select m;
        return View(movies);
    }

And then send that information to a view:

@model IEnumerable<xxxx.Models.Art>
@{
Layout = null;
}

<ul>
@foreach (var item in Model)
{
<li>@Html.DisplayFor(modelItem => item.Benämning_10)</li>
}

This works when I just run it as a normal controller and view, it returns a list of what I want. But if I want to call it from _layout.cshtml (because this menu should appear on every page) like this:

<div id="sidebar">@Html.RenderAction(MenuController)</div>

Then it generates the following error:

CS0103: The name 'MenuController' does not exist in the current context

What is the proper way of calling an action/view/whatever from the _layout.cshtml file?

Was it helpful?

Solution

You should call

@Html.RenderAction("_MenuController")

and be sure that you have a working rule in your Global.asax

As suggested in another answer would be better to use

return PartialView();

I also suggest you to use the ChildActionOnlyAttribute to be sure that this action will never be called as a standard action.

So something like that:

[ChildActionOnly]
public PartialViewResult _MenuController()
{
    var movies = from m in db.Art
                 where m.ArtikelNr.StartsWith("Webcat")
                 select m;
    return PartialView(movies);
}

OTHER TIPS

@{Html.RenderAction("MenuController");} 

or

@Html.Action("MenuController")

Simply

@Html.RenderAction("MenuController")

You've forgotten quotes around your string parameter

<div id="sidebar">@Html.RenderAction("_MenuController")</div>

Quotes around your action name :) It might also be good practice to return a partial view:

return PartialView(movies);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top