ASP.net MVC 4从数据库加载菜单到部分视图

5

我是一名MVC新手。

我想做的是从数据库加载菜单并在局部视图中显示它。这个局部视图将从_Layout视图调用。

主页控制器

在主页控制器中,我添加了一个名为"_MainMenu"的动作。

public class HomeController : Controller
{
        mrpDatabase _db = new mrpDatabase();

        public ActionResult _MainMenu()
        {
          return PartialView("_MainMenu", _db.menu.ToList());
        }
        ....
}

部分视图

这是我的_MainMenu部分视图。

@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 was unhandled by user code.Object reference not set to an instance of an object"

看起来我的_MainMenu中的“Model”为空。

我做错了什么?

谢谢。

2个回答

9
如果您的部分视图使用了模型,您需要像这样传递模型:
@Html.Partial("_MainMenu", Model.ListOfMenus)

或类似的东西。目前,您没有为 _MainMenu 视图指定模型,因此使用 null。当您尝试使用 @foreach 时,会抛出您看到的异常。

请注意,@Html.Partial("_MainMenu") 不会调用您的 _MainMenu 控制器操作,只会呈现该名称的视图。

如果要调用操作,可以像这样使用子操作:

@Html.Action("_MainMenu", "HomeController")

谢谢。我使用@Html.Action("_MainMenu", "HomeController")它可以正常工作。 - Haqi Petrucci

4
您已经得到了答案。检查_db.menu.ToList()是否返回null。我建议您使用Model-View-ViewModel模式。为视图创建模型,并将其返回给View,以便您可以控制模型和要显示给视图的内容。
您没有将模型信息传递给HTML Partial方法,结果尝试迭代集合。因此,它会抛出空引用异常。
类似于这样的东西。
 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>

谢谢。这增加了我对MVC概念的了解。 - Haqi Petrucci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接