3

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

我在这里寻找意见。

4

8 回答 8

4

ASP.NET 站点地图功能就是为此而构建的,并且在很多情况下都能很好地工作。如果您希望您的菜单看起来与站点地图不同,这里有一些解决方法

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

于 2008-09-10T14:10:12.820 回答
2

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

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

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

于 2008-09-10T14:09:06.893 回答
1

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

我使用 SiteMapDataSource 填充了 ASP.NET TreeView 和 Menu 导航控件。但是非管理员用户可以看到仅限管理员的页面。

  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
    
于 2008-09-11T21:35:05.863 回答
0

如果菜单是每个用户的动态菜单,那么您必须为每个用户访问数据库。从那时起,我可能会将其存储在会话中,以避免将来往返数据库。

如果它是动态的,但整个站点看到相同的项目,则将其放入数据库并缓存结果

于 2008-09-10T14:07:53.060 回答
0

绑定到站点地图当然是最简单的。

于 2008-09-10T14:08:50.530 回答
0

这完全取决于网站的工作方式。我同意大多数人的观点,即站点地图通常是最好的方法。但是,如果您使用的是 CMS,则可能需要将其保存在数据库中。如果您有一个以分类为中心的网站,请使用分类来构建菜单。没有“最佳方式”进行导航,只有特定情况下的最佳方式。

于 2008-09-10T14:16:47.483 回答
0

我们有一个类似的功能。

应用程序菜单从数据库加载到母版页上,因为可见菜单选项取决于用户的权限。

数据库上的一些约定和巧妙的结构确保菜单加载代码是通用的,并在选择某个菜单选项时自动导航到正确的屏幕。我们使用 UIP 进行导航,使用 ComponentArt 进行 Web 控件。

BTW ComponentArt 很烂。然后我想所有第三方控制库都可以。

于 2008-09-10T14:21:26.600 回答
0

从用户的角度来看,高效访问是一项基本功能。一种通用的建议方法是 字典查找,它也非常适合大型和嵌套的菜单结构。用户通过点击或独特的按键进行导航,另外箭头键前进(右)或返回(左)与往常一样向上/向下。我建议填充菜单,除了最初的初始元素,只要选择最终元素,就会提供JavaScript操作。

于 2010-08-06T13:26:45.307 回答