共享视图中的ASP.NET MVC数据库驱动菜单

时间:2014-06-12 18:38:17

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

我需要一些关于在_layout.cshtml文件中插入菜单的指导。我遇到了两个问题: 1)即使我创建了一个包含两个数据模型的附加模型,我也无法将这两个模型传递给布局文件 例如:

型号:

public class IndexModel
{
    public tblMenu tblMenu { get; set; }
    public tblSite tblSite { get; set; }
}

我需要菜单表和同一页面上的网站表信息。

2)当我创建一个部分视图来传递菜单数据时,我不断得到异常,告诉我我不能以这种方式使用模型。

我的部分观点:

    @model mvcSPS.Models.IndexModel
    <li>@Model.tblMenu.MenuName</li>

我的控制器:

   public ActionResult _menu()
   {
       return PartialView(db.IndexModels.ToList());
   }

我的_layout.cshtml

            <ul id="navigation">
                @foreach (var item in Model)
                {
                    @Html.Partial("_menu")
                }
            </ul>

我已经在网上搜索并且非常坦率。我从ASP经典(是的,我知道)到ASP.net和MVC的过渡非常困难。

非常感谢您的温和指导。 感谢

安德鲁

1 个答案:

答案 0 :(得分:1)

更改_layout.cshtml中的@ Html.Partial以调用控制器函数并呈现Action方法的结果。

@foreach (var item in Model)
{
  Html.RenderAction("_menu", "Home");
}

注意:你不需要预先添加'@',因为它位于foreach循环的上下文中

编辑:根据我的评论建议

HomeController中:

public ActionResult Menu() {
  return PartialView("_menu", db.IndexModels.ToList());
}

_layout.cshtml

@{Html.RenderAction("Menu", "Home");} //be sure to fully-qualify the controller since it's layout, otherwise it'll look to the current controller based on route values collection

_menu.cstml

<nav>
  <ul>
  @foreach(var item in Model) {
    Html.Partial("_menuItem", item)
  }
  </ul>
</nav>

_menuItem.cshtml

@foreach(var item in Model) {
  <li>
    <a href="http://url">text</a>
    @if(item.Children.Any())
    {
      <ul>
         Html.Partial("_menuItem", item.Children)
      </ul>
    }
  </li>
}