关于.net 3.5:在母版页上填充菜单控件的最佳方法是什么?

关于.net 3.5:在母版页上填充菜单控件的最佳方法是什么?

What is the best way to populate a menu control on a Master Page?

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

我正在这里寻求意见。


为此目的而构建的ASP.NET Sitemap功能在许多情况下都可以很好地工作。如果您希望菜单与站点地图看起来有所不同,请采取以下解决方法。

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


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

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

如果它是一个动态菜单,需要进行很多更改,那么从数据库中获取项目可能是一个好主意,但是您肯定要缓存它们,因此DB不会在每个页面渲染时都被命中。<铅>


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

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

  • 我创建了一个web.sitemap网站地图文件。然后,我使用ASP.NET网站管理工具来设置访问规则。

  • 我在.master页上添加了导航控件...

    1
     
  • 我在我的web.config文件中将securityTrimmingEnabled设置为" true" ...

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?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代码中调整了树...

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    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

  • 从用户的angular来看,有效访问是一项主要功能。
    通用的提示方法是
    字典查询
    也非常适合大型和嵌套菜单结构。
    用户可以通过单击或唯一的按键进行导航,此外,箭头键可以像往常一样向上(向下)前进(向右)或返回(左)。我建议在请求时填充菜单中的初始菜单之外的菜单,并在每次选择最后一个元素时提供JavaScript操作。


    我们有类似的功能。

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

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

    BTW ComponentArt很烂。再说一次,我想所有第三方控制库都可以。


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


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


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

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


    推荐阅读