2016-06-20 124 views
1

我已經在這裏和網上閱讀了一些類似的主題,但我認爲我沒有看到過將這個分類爲重複的主題,所以我將繼續併發布它。我目前我的加載動態菜單從數據庫中,像這樣:MVC中數據庫的動態菜單

public void LoadMenus() 
    { 
     var dbContext = new ContentClassesDataContext(); 
     var menus = from m in dbContext.Menus 
        where m.MenuName != "Home" && m.MenuGroup == "RazorHome" && m.RoleID == "Facility" 
        orderby m.Sequence, m.MenuName 
        select m; 

     var html = ""; 

     if (menus.Any()) 
     { 
      html += "<span/>"; 

      foreach (var menu in menus) 
      { 
       html = html + $"<a href='{menu.URL}'>{menu.MenuName}</a><br/>"; 
      } 
      html += "<hr>"; 
     } 

     Session["Menus"] = html; 
    } 

LoadMenus()是我的控制器類,所以我不能(據我所知)使用剃刀語法。我寧願從視圖中加載菜單,以便我可以使用@Html.ActionLink(linkText, actionName, controllerName)。按照我目前的做法加載HTML將根據當前控制器生成不同的鏈接文本,因此鏈接並不總是正確呈現。是否可以從視圖訪問數據庫?或者也許只是將數據庫中的內容從控制器傳遞到視圖,然後以這種方式呈現菜單?

+2

如果你想使用Razor,創建一個PartialView並使LoadMenus成爲一個動作結果並返回PartialView(「_ Menu」,菜單);'在你的部分視圖中,你可以通過你的'@model IEnumerable

'循環並建立你的菜單。只需將@ @ Hmtl.Action(「LoadMenus」)'放在你想要的菜單 – JamieD77

+0

啊,我認爲'@ model'位可能是我正在尋找的。我能夠使用菜單的局部視圖,但仍不確定如何從視圖中訪問信息。 –

+0

我也能夠通過使用'Url.Action()'來生成鏈接和指定控制器,如下所示:'$「{menu.MenuName}
」' –

回答

4

你應該保留你的html在cshtml視圖中。

您應該通過視圖模型而不是通過會話傳遞數據。

1)

在控制器方面,獲得菜單數據(在這個例子中,我們取一些假數據)。

創建可以保持菜單數據,並將其傳遞給視圖,如以下所示的視圖模型:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var menu = GetMenu(); 
     var vm = new ViewModel() {Menu = menu}; 
     return View(vm); 
    } 
    private Menu GetMenu() 
    { 
     var menu = new Menu(); 
     var menuItems = new List<MenuItem>(); 
     menuItems.Add(new MenuItem() { LinkText = "Home" , ActionName = "Index", ControllerName = "Home"}); 
     menuItems.Add(new MenuItem() { LinkText = "About", ActionName = "About", ControllerName = "Home" }); 
     menuItems.Add(new MenuItem() { LinkText = "Help", ActionName = "Help", ControllerName = "Home" }); 
     menu.Items = menuItems; 

     return menu; 
    } 
} 

2)

這是視圖模型

public class ViewModel 
{ 
    public Menu Menu { get; set; } 
} 

此視圖是如何將菜單數據呈現爲HTML菜單的示例。

@model WebApplication1.Models.ViewModel 

<ul id="menu"> 
    @foreach (var item in @Model.Menu.Items) 
    { 
     <li>@Html.ActionLink(@item.LinkText, @item.ActionName, 
       @item.ControllerName)</li> 
     } 
</ul> 

3)

這是使用(從的DbContext代表的實體)

public class Menu 
{ 
    public List<MenuItem> Items { get; set; } 
} 

public class MenuItem 
{ 
    public string LinkText { get; set; } 
    public string ActionName { get; set; } 
    public string ControllerName { get; set; } 
} 

下面的例子菜單類是一些鏈接,讓你開始:

http://www.codeproject.com/Articles/585873/Basic-Understanding-On-ASP-NET-MVC http://www.asp.net/mvc/overview/getting-started/introduction/getting-started

+0

我能夠按照您的答案中所述在部分視圖中加載菜單但是,在第一次點擊某個項目後,「Menu.Items」變爲「null」,並且在嘗試呈現新頁面時網站會中斷。 –