gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:37:36 24 4
gpt4 key购买 nike

我正在寻找一种在不违反 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com