2015-05-19 69 views
0

我想根据用户登录ID动态绑定母版页中的菜单项列表。我是新来的MVC模式,我通过引用很多网站而变得更加困惑。如果你指导我创建动态菜单,这将对我有所帮助。以下是我已经尽了全力的代码,使用数据库在asp.net MVC中添加动态菜单项

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#accordian h3").click(function() { 
      $("#accordian ul ul").slideUp(); 
      if (!$(this).next().is(":visible")) { 
       $(this).next().slideDown(); 
      } 
     }); 
    }); 
</script> 

<nav class="navbar-default navbar-static-side" role="navigation"> 
<div id="accordian"> 
    <ul class="nav" id="side-menu"> 
     <li class ="nav-header"> 
         @{ 
       foreach (var MenuItem in Model.MainMenuModel) 
       { 

        var SubMenuItem = Model.SubMenuModel.Where(m => m.MainMenuID == MenuItem.ID); 

        <h3><a href="@MenuItem.MainMenuURL"> @MenuItem.MainMenuItem </a></h3> 

        if (SubMenuItem.Count() > 0) 
        { 
         <ul> 
          @foreach (var SubItem in SubMenuItem) 
          { 
           <li><a href='@SubItem.SubMenuURL'>@SubItem.SubMenuItem</a></li> 
          } 
         </ul> 
        } 

       } 
      } 

我有业务,数据和服务组件在我的项目。我必须从哪里开始声明菜单项。提前致谢。

+0

我没有看到你在哪里根据用户ID进行菜单选择。 –

+0

我错过了......我将它通过javascript中的会话传递并在控制器中接收它。我的疑问是,我将如何从数据库接收菜单到视图页面? –

回答

1

我认为使用@Html.Action()来渲染你的菜单传递你的用户ID(或者在你的操作中读取它 - 例如从会话读取它 - 取决于你存储这些信息的位置)将是最简单的。

通过这种方法,您可以在一个文件中放置HTML和JS,从任何地方都可以轻松地将模型传递给它(因为您只需呈现动作即可,无需附加任何特定于其他模型的内容或。ViewBag/ViewData

可能的功能也能像:

@Html.Action("Render", "Menu")

你的行动

[ChildActionOnly] 
public PartialViewResult Render() { 
var userId = Session["some_key"]; 
var model = _userMenuService.GetModelForUserId(userId); 
return PartialView(model); 
} 

你应该明白了吧:)

编辑:

要映射数据,查看您所需要提供一些视图模型,它可以接受一些构造收集IEnumerable<MenuItem> ,这将反映到特定的视图模型属性,或者您可以传递所有菜单项的集合以查看并将它们用作模型。

+0

正如你所提到的,我将通过用户ID作为会话值。如何将数据存储库中的菜单值返回到查看页面? –

+0

您必须将您的数据映射到某个视图模型,我编辑了我的答案以反映这一点。 – Kamo

+0

每当Master(Layout.cshtml)刷新时加载菜单。如何使该菜单只加载一次? – user3373603