2015-05-19 100 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