我是一名mvc新手。
我要做的是从数据库加载菜单并在局部视图中显示它。将从_layout视图调用此局部视图。
家庭控制器
在家庭控制器中我添加了一个名为“_MainMenu”的动作public class HomeController : Controller
{
mrpDatabase _db = new mrpDatabase();
public ActionResult _MainMenu()
{
return PartialView("_MainMenu", _db.menu.ToList());
}
....
}
PartialView
这是我的_MainMenu PartialView
@model IEnumerable<appMRP.Models.menu>
<ul id="menu">
@foreach (var item in Model)
{
<li>@item.menu1</li>
}
</ul>
布局页面
这个部分菜单显示在我的_Layout.cshtml中,如此
<nav>
@Html.Partial("_MainMenu")
</nav>
当我跑这个。我收到了错误 “ NullReferenceException未被用户代码处理。 对象引用未设置为对象的实例“
我的_MainMenu中的“模型”似乎为空
我做错了什么?
谢谢
答案 0 :(得分:9)
如果你的局部视图使用模型,你需要像这样传递它:
@Html.Partial("_MainMenu", Model.ListOfMenus)
或其他相似之处。目前,您没有为_MainMenu
视图指定模型,因此使用了null
。当您尝试@foreach
时,它会抛出您看到的异常。
请注意,@Html.Partial("_MainMenu")
并未调用您的_MainMenu
控制器操作,只是呈现该名称的视图。
如果要调用某个操作,可以使用以下子操作:
@Html.Action("_MainMenu", "HomeController")
答案 1 :(得分:4)
Model-View-ViewModel
模式。为视图创建模型。并将其返回到View,以便您可以控制模型以及向视图显示的内容。
像这样的事情
public class MenuViewModel
{
public int menuID { get; set; }
public string menuname { get; set; }
public string otherProperty { get; set; }
public string someotherProperty { get; set; }
}
在你的视图中
@model IEnumerable<MenuViewModel>
<nav>
@Html.Partial("_MainMenu",Model)
</nav>