ASP.net MVC 4从数据库加载菜单到Partial View

时间:2013-01-15 05:40:01

标签: asp.net-mvc razor asp.net-mvc-partialview

我是一名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中的“模型”似乎为空

我做错了什么?

谢谢

2 个答案:

答案 0 :(得分:9)

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

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

或其他相似之处。目前,您没有为_MainMenu视图指定模型,因此使用了null。当您尝试@foreach时,它会抛出您看到的异常。

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

如果要调用某个操作,可以使用以下子操作:

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

答案 1 :(得分:4)

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

  1. 您没有将模型信息传递给HTML Partial方法,因为结果,您尝试迭代集合。所以它会抛出一个空引用异常。
  2. 像这样的事情

     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>