Control Visible Menus with web.sitemap

A quick way to get a menu to work on our website, is using the Menu control and assign it to a web.sitemap using SiteMapDataSource.

Example of web.sitemap file:

                                                          

Sample code to add to the page menu:

<asp:Menu ID="NavigationMenu" runat="server" CssClass="menu"       EnableViewState="False" IncludeStyleBlock="False" Orientation="Horizontal"       DataSourceID="SiteMapDataSource1"> </asp:Menu> <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server"  ShowStartingNode="false" />

Running the application, we will have something like the next picture:

!

To show or hide the menu depending on the type of access each user, we may define the Roles in each SiteMapNode.

Another way to control the menus visible, is to add an attribute in each SiteMapNode and depending on its value, or will not display each menu.

For this, the web.sitemap will be something like:

                                                          

The attribute "visible" is that we will indicate whether or not the menu is shown, and we'll add the event MenuItemDataBound on Menu with the following code:

protected void NavigationMenu_MenuItemDataBound(object sender, MenuEventArgs e) {     SiteMapNode node = e.Item.DataItem as SiteMapNode;      if (!string.IsNullOrEmpty(node["visible"]))      {          bool isVisible;          if (bool.TryParse(node["visible"], out isVisible))          {              if (!isVisible)              {                  if (e.Item.Parent!= null)                      e.Item.Parent.ChildItems.Remove(e.Item);                  else                      ((Menu)sender).Items.Remove(e.Item);              }          }      } }

Thus, we have our menu to show all nodes whose attribute value equals True.

To be able to directly control the menus that will be visible or not, I used a Treeview to bind the web.sitemap file and set all items to show a checkbox, which will indicate the status of the Visible attribute.

<asp:TreeView runat="server" ID="tvMenus" AutoGenerateDataBindings="False" DataSourceID="XmlDsSiteMap"      OnTreeNodeCheckChanged="tvMenus_TreeNodeCheckChanged" ShowCheckBoxes="All" ShowLines="True"      OnTreeNodeDataBound="tvMenus_TreeNodeDataBound">               <asp:TreeNodeBinding DataMember="siteMapNode" SelectAction="None" ShowCheckBox="True"              TextField="title" />          <asp:TreeNodeBinding DataMember="siteMapNode" TextField="title" />          <asp:TreeNodeBinding DataMember="siteMapNode" TextField="title" />          <asp:TreeNodeBinding DataMember="siteMap" />      </asp:TreeView> <asp:XmlDataSource ID="XmlDsSiteMap" runat="server" DataFile="~/Web.sitemap" XPath="/*/*/*"> </asp:XmlDataSource>

protected void tvMenus_TreeNodeDataBound(object sender, TreeNodeEventArgs e) {     XmlElement node = e.Node.DataItem as XmlElement;      if (node.Attributes["visible"]!= null)      {         if (!string.IsNullOrEmpty(node.Attributes["visible"].Value))          {              bool isVisible;              if (bool.TryParse(node.Attributes["visible"].Value, out isVisible))              {                  e.Node.Checked = isVisible;              }              else                  e.Node.Checked = true;          }          else              e.Node.Checked = true;      } }

!

Finally, to record the attribute changes depending on the state of the checkbox, we added to the Treeview TreeNodeCheckChanged event the following code:

protected void tvMenus_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e) {     XmlDsSiteMap.GetXmlDocument.SelectSingleNode(e.Node.DataPath) .Attributes["visible"].Value = e.Node.Checked.ToString; }

And we add the button to save the changes the following code:

protected void btn_Click(object sender, EventArgs e) {     XmlDsSiteMap.Save; }

Now just enable and disable these items like we want to.

!

This article is part of the GWB Archives. Original Author: Tiago Salgado

New on Geeks with Blogs

  • We Won The One Award I Actually Care About

    Full Scale made the Inc. 5000 for the fifth year straight, the 12th listing across my three companies. Here is why the one award you cannot buy is worth stopping for.

  • Your Customers Build the Features Now

    I let a tool I liked sit dead for a year rather than build the features I wanted. An MCP server meant I never had to, and your customers can do the same to your product.

  • Get the Size of a Directory in Linux the Easy Way

    du -sh for the quick answer, ncdu for the cleanup, df for the disk itself: every command for checking directory size in Linux, plus why du and df never agree.

  • Vim Search and Replace: The Ultimate Guide

    One :%s command replaces every match in a file before a find dialog would even open. The Vim substitute patterns worth the muscle memory: flags, ranges, capture groups, and multi-file edits.