数据库?页面变量?枚举?

我在这里寻求意见。

有帮助吗?

解决方案

ASP.NET Sitemap 功能就是为此而构建的,并且在很多情况下都运行良好。如果你到达了你想要的地方 菜单看起来与站点地图不同,这里有一些解决方法.

如果您有动态站点结构,您可以 创建自定义站点地图提供商. 。您可能会遇到麻烦大于其价值的情况,但总的来说,从站点地图填充菜单可以为您提供一些不错的功能,例如安全修剪,其中菜单选项适合登录用户。

其他提示

这是一个有趣的问题,有很多方法可以解决它。

您可以从 XML 加载菜单结构,这就是内置 ASP.NET 导航控件/“站点地图”设置的工作方式。总的来说,这可能是一个不错的选择,并且 Visual Studio 中有相当好的工具。

如果它是一个需要进行大量更改的动态菜单,那么从数据库获取项目可能是一个好主意,但您肯定希望缓存它们,这样数据库就不会在每个页面渲染时都受到影响。

我已经使用创建了一个网站 ASP.NET 登录控件表单验证 用于 ASP.NET Web 应用程序的成员资格/凭据。我正在使用 站点地图 用于站点导航。

我有使用 SiteMapDataSource 填充的 ASP.NET TreeView 和菜单导航控件。但仅限管理员访问的禁区页面对非管理员用户可见。

  1. 我创建了一个 web.sitemap 站点地图文件。和我 使用 ASP.NET 网站管理工具设置访问规则.

  2. 我在我的 .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" />
    
  3. 我在 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>
    
  4. 我调整了 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 操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top