5

我是一个mvc新手。

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

家庭控制器

在 Home 控制器中,我添加了一个名为“_MainMenu”的操作

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

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

部分视图

这是我的 _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 中的“模型”为空

我做错什么了 ?

谢谢你

4

2 回答 2

9

如果您的局部视图使用模型,则需要像这样传递它:

@Html.Partial("_MainMenu", Model.ListOfMenus)

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

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

如果你想调用一个动作,你可以使用这样的子动作:

@Html.Action("_MainMenu", "HomeController")
于 2013-01-15T05:46:31.270 回答
4

你已经得到了答案。检查 _db.menu.ToList() 没有返回 null。我建议你使用Model-View-ViewModel模式。为视图创建模型。并将其返回给 View,以便您可以控制模型以及向视图显示的内容。

  1. 您没有将模型信息传递给 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>
于 2013-01-15T05:45:57.603 回答