asp.net-mvc - MVC 中来自数据库的动态菜单

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

最佳答案

您应该将 html 保留在 cshtml View 中。

您应该通过 View 模型而不是通过 session 传递数据。

1)

在 Controller 中,获取菜单数据(在这个例子中我们获取了一些假数据)。

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

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)

这是 View 模型

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

此 View 是如何将菜单数据呈现为 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

关于asp.net-mvc - MVC 中来自数据库的动态菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37928786/

相关文章:

asp.net-mvc-3 - 从自定义 VirtualPathProvider(ASHX 源)加载 Razor View 时出现奇怪的行为

asp.net-mvc - 有条件地在 webgrid 中显示图像 - mvc 3

mysql - 为什么我不能使用 Fluent NHibernate 将其插入到 MySQL InnoDB 表中?

asp.net-mvc - ASP.NET Web Api OData : How to validate Delta<Entity>?

.net - 有谁听说过 .NET 4.0 可能如何改变/影响 Asp.net MVC?

c# - 在.Net Core 2.0中使用MVC6选择标签不显示占位符

asp.net-mvc - 从部分 View mvc razor 获取值

javascript - 如何向asp.net MVC链接元素添加ID属性

javascript - 如何将javascript应用于 Accordion 内部调用的局部 View ?

javascript - 什么是带有选项卡的好的 JavaScript 网格?