在母版页上填充菜单控件的最佳方法是什么?

时间:2008-09-10 14:05:57

标签: .net-3.5 master-pages sitemap menu

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

我在这里寻找意见。

8 个答案:

答案 0 :(得分:4)

ASP.NET Sitemap功能是为此而构建的,并且在很多情况下都能正常运行。如果你到了想要Menu to look different from your Sitemap, here are some workarounds的地方。

如果您有动态网站结构,则可以create a custom sitemap provider。你可能会遇到麻烦而不是它的价值,但通常从你的站点地图填充你的菜单会给你一些很好的功能,比如安全修整,其中菜单选项适合登录用户。

答案 1 :(得分:2)

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

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

如果它是一个需要改变很多的动态菜单,从数据库中获取项目可能是一个好主意,但你肯定想要缓存它们,因此数据库不会在每个页面渲染上受到影响。 / p>

答案 2 :(得分:1)

我使用ASP.NET Login ControlsForms Authentication创建了一个网站,用于ASP.NET Web应用程序的成员资格/凭据。我正在使用site map进行网站导航。

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

  1. 我创建了一个web.sitemap站点地图文件。我used the ASP.NET Web Site Administration Tool to set up access rules

  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
    

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

绑定到Sitemap肯定是最简单的。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我们有类似的功能。

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

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

BTW ComponentArt很糟糕。然后我再次假设所有第三方控制库都这样做。

答案 7 :(得分:0)

从用户的角度来看,高效访问是一项原始功能。 通用的暗示方法是 dictionary lookup, 这也很适合大型和嵌套的菜单结构。 用户通过点击或唯一按键导航,另外箭头键向前/向下(向右)或向上(向左)向上/向下照常导航。我建议根据请求填充菜单,除了初始菜单,并在选择最终元素时提供javascript操作。