asp.net-mvc - 在 ASP.NET MVC 中连接数据库驱动菜单的最佳方式

标签 asp.net-mvc linq-to-sql .net-3.5 master-pages

我正在寻找一种在不违反 MVC 原则的情况下处理 ASP.NET MVC 中数据库驱动的菜单的方法。我想用我的数据库中的内容替换硬编码的默认“主页、关于”菜单。我将如何连接它?我会在我的 Site.Master 中设置一个 ContentPlaceHolder 并在我的 View 中重新生成吗?这对我来说似乎不对。

最佳答案

我的主菜单是一个 ViewUserControl,它在我的 MasterPage 中呈现为部分 View 。虽然我的是硬编码的,但您可以轻松地从 ViewData 生成它。从 View 数据生成它可能涉及实现一个自定义 FilterAttribute,它指定用于生成将应用于每个 Controller /操作的菜单的参数,或者,如果菜单在每个页面上都相同,则实现一个基本 Controller 来填充通过覆盖 OnActionExecuted 并添加到其中的 ViewData,在 View 数据中。

示例(请注意,您可能会对结果使用缓存,而不是每次都从数据库中获取它们)。

模型类

public class MenuItem
{
    public string Text { get; set; }
    public string Action { get; set; }
    public string Controller { get; set; }
}

public class Menu
{
     public string Heading { get; set; }
     public IEnumerable<MenuItem> Items { get; set; }
}

MenuControl.ascx:类型 System.Web.Mvc.ViewPage<List<Menu>>

<div id="mainMenu">
<% foreach (var menu in Model) { %>
   <div class="menu">
      <h2 class="menu-heading"><%= menu.Heading %></h2>
      <% foreach (var item in Model.Items) { %>
         <%= Html.ActionLink( item.Text,
                              item.Action,
                              item.Controller,
                              null,
                              { @class = "menu-item" } ) %>
      <% } %>
   </div>
<% } %>
</div>

母版页

<html>
<head>
...
<asp:ContentPlaceHolder runat="server" id="HeaderContent">
</head>
<body>

... other HTML...

<% Html.RenderPartial( "MenuControl", ViewData["mainMenu"], ViewData ); %>

<asp:ContentPlaceHolder runat="server" id="BodyContent" />

... more HTML ...

</body>
</html>

基础 Controller

public override void OnActionExecuted( ActionExecutedContext filterContext )
{
     if (filterContext != null)
     {
         var context = filterContext.Result as ViewResult;
         if (context != null) {
             context.ViewData["mainMenu"] = 
                 db.MenuData.Where( m => m.Type == "mainMenu" )
                            .Select( m => new Menu {
                                Heading = m.Heading,
                                Items = db.ItemData.Where( i => i.MenuID == m.MenuID )
                                               .OrderBy( i => i.Name )
                                               .Select( i => new MenuItem {
                                                   Text = i.Text,
                                                   Action = i.Operation,
                                                   Controller = i.Table
                                               })
                            });
         }
    }
}

关于asp.net-mvc - 在 ASP.NET MVC 中连接数据库驱动菜单的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/723994/

相关文章:

c# - 文本 block 在数据网格 WPF 中选择前景色

c# - 使用 C# 在 dotNet 3.0+ 中内联函数?

c# - 一个只允许N个并发线程的函数

c# - 我正在尝试通过 C# 调用操作结果方法

jquery - 如何在一页上处理多个表单?

c# - 将 Linq 查询结果转换为字典

LINQ 版本的 TOP PERCENT

javascript - Bootstrap 确认在局部 View 中不起作用

asp.net-mvc - 在razor View .net core 2中访问 session 变量

c# - 使用 Linq to SQL 在本地和远程之间切换 `ConnectionStrings`