i'm an mvc newbie.
What i'm trying to do is to load menu from database and display it in partial view. This partial view will be called from _layout view.
Home Controller
in Home controller i add an action called "_MainMenu"
public class HomeController : Controller
{
mrpDatabase _db = new mrpDatabase();
public ActionResult _MainMenu()
{
return PartialView("_MainMenu", _db.menu.ToList());
}
....
}
PartialView
this is my _MainMenu PartialView
@model IEnumerable<appMRP.Models.menu>
<ul id="menu">
@foreach (var item in Model)
{
<li>@item.menu1</li>
}
</ul>
Layout Page
this partial menu is displayed in my _Layout.cshtml like this
<nav>
@Html.Partial("_MainMenu")
</nav>
when i run this. i got error "NullReferenceException was unhandled by user code. Object reference not set to an instance of an object"
seems the "Model" in my _MainMenu is null
what did i do wrong ?
thank you
If your partial view uses a model, you need to pass it in like this:
@Html.Partial("_MainMenu", Model.ListOfMenus)
or something to that effect. Currently, you are not specifying a model for the _MainMenu
view, so null
is used. When you attempt a @foreach
, it throws the exception you see.
Note that @Html.Partial("_MainMenu")
isn't calling your _MainMenu
controller action, just rendering the view of that name.
If you want to call an action, you can use a child action like this:
@Html.Action("_MainMenu", "HomeController")
you already got the answer. check the _db.menu.ToList() is not returning null. I suggest you to use Model-View-ViewModel
Pattern. create model for view. and return it to View, so that you can control over the model and what to show to the view .
some thing like this
public class MenuViewModel
{
public int menuID { get; set; }
public string menuname { get; set; }
public string otherProperty { get; set; }
public string someotherProperty { get; set; }
}
in Your View
@model IEnumerable<MenuViewModel>
<nav>
@Html.Partial("_MainMenu",Model)
</nav>
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