在母版页上填充菜单控件的最佳方法是什么?
-
09-06-2019 - |
题
数据库?页面变量?枚举?
我在这里寻求意见。
解决方案
ASP.NET Sitemap 功能就是为此而构建的,并且在很多情况下都运行良好。如果你到达了你想要的地方 菜单看起来与站点地图不同,这里有一些解决方法.
如果您有动态站点结构,您可以 创建自定义站点地图提供商. 。您可能会遇到麻烦大于其价值的情况,但总的来说,从站点地图填充菜单可以为您提供一些不错的功能,例如安全修剪,其中菜单选项适合登录用户。
其他提示
这是一个有趣的问题,有很多方法可以解决它。
您可以从 XML 加载菜单结构,这就是内置 ASP.NET 导航控件/“站点地图”设置的工作方式。总的来说,这可能是一个不错的选择,并且 Visual Studio 中有相当好的工具。
如果它是一个需要进行大量更改的动态菜单,那么从数据库获取项目可能是一个好主意,但您肯定希望缓存它们,这样数据库就不会在每个页面渲染时都受到影响。
我已经使用创建了一个网站 ASP.NET 登录控件 和 表单验证 用于 ASP.NET Web 应用程序的成员资格/凭据。我正在使用 站点地图 用于站点导航。
我有使用 SiteMapDataSource 填充的 ASP.NET TreeView 和菜单导航控件。但仅限管理员访问的禁区页面对非管理员用户可见。
我创建了一个 web.sitemap 站点地图文件。和我 使用 ASP.NET 网站管理工具设置访问规则.
我在我的 .master 页面上添加了导航控件...
<asp:SiteMapPath ID="SiteMapPath1" runat="server" /> <asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource2" /> <asp:TreeView ID="TreeView1" runat="server" DataSourceID="SiteMapDataSource1" /> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" /> <asp:SiteMapDataSource ID="SiteMapDataSource2" runat="server" ShowStartingNode="False" />
我在 web.config 文件中将 securityTrimmingEnabled 设置为“true”...
<?xml version="1.0"?> <configuration> ... <system.web> ... <siteMap defaultProvider="default"> <providers> <clear/> <add name="default" type="System.Web.XmlSiteMapProvider" siteMapFile="web.sitemap" securityTrimmingEnabled="true"/> </providers> </siteMap> ... </system.web> ... </configuration>
我调整了 master.vb 代码隐藏文件中的树...
Protected Sub TreeView1_DataBound( ByVal sender As Object, ByVal e As EventArgs ) Handles TreeView1.DataBound 'Collapse unnecessary menu items... If TreeView1.SelectedNode IsNot Nothing Then Dim n As TreeNode = TreeView1.SelectedNode TreeView1.CollapseAll() n.Expand() Do Until n.Parent Is Nothing n = n.Parent n.Expand() Loop Else TreeView1.ExpandAll() End If End Sub
如果菜单是动态的 每个用户 那么你就必须为每个用户访问数据库。从那时起,我可能会将其存储在会话中,以避免将来与数据库的往返。
如果是动态的,但整个站点看到相同的项目,则将其放入数据库并缓存结果
绑定到站点地图当然是最简单的。
这完全取决于网站的运作方式。我同意大多数人的观点,站点地图通常是最好的方法。但是,如果您使用 CMS,则可能需要将其保存在数据库中。如果您有一个以分类为中心的网站,请使用分类来构建菜单。导航没有“最佳方法”,只有针对特定情况的最佳方法。
我们有类似的功能。
应用程序菜单从数据库加载到母版页上,因为可见的菜单选项取决于用户的权限。
数据库上的一些约定和巧妙的结构确保菜单加载代码是通用的,并且在选择某个菜单选项时自动导航到正确的屏幕。我们使用 UIP 进行导航,使用 ComponentArt 进行 Web 控件。
顺便说一句,ComponentArt 很糟糕。我再次认为所有第三方控件库都是如此。
从用户的角度来看,高效访问是一个主要特征。通用的暗示方法是字典查找,这也非常适合大型和嵌套的菜单结构。用户通过点击或独特的按键进行导航,另外箭头键像平常一样向上/向下前进(向右)或后退(向左)。我建议根据请求填充除初始菜单之外的菜单,并在选择最终元素时提供 JavaScript 操作。