MVC中数据库的动态菜单

时间:2016-06-20 17:51:02

标签: asp.net-mvc razor

我在这里和网上都阅读了一些类似的主题,但我认为我没有看到过将其归类为重复的内容,所以我将继续发布它。我目前正在从数据库加载动态菜单,如下所示:

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()在我的控制器类中,因此我无法(据我所知)使用Razor语法。我宁愿从视图中加载菜单,以便我可以使用@Html.ActionLink(linkText, actionName, controllerName)。按照我当前的方式加载HTML将根据当前控制器生成不同的链接文本,因此链接并不总是正确呈现。是否可以从视图中访问数据库?或者也许只是将数据库中的内容从控制器传递到视图,然后以这种方式呈现菜单?

1 个答案:

答案 0 :(得分:4)

你应该将你的html保存在cshtml视图中。

您应该通过viewmodel而不是通过会话传递数据。

1)

在控制器中,获取菜单数据(在本例中我们获取一些假数据)。

创建一个可以保存菜单数据并将其传递给视图的viewmodel,如下所示:

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)

这是viewmodel

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