asp.net-mvc-3renderaction

Problems with RenderAction in MVC 3


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?


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);
    }