Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 663
  • Last Modified:

Change menu programmatically

I have a web site consisting of
- MasterPage.master containing a menu
- Web.sitemap that provides the menu items (Root (hidden), Home, RSS)
- Default.aspx containing a radio button list
- Rss.aspx

I want to change the query string of the rss feed in the menu depending on the selected item in the radio list

My project is based on http://www.codeproject.com/aspnet/ABetterSiteMapResolve.asp
I created the PageCode.cs in the Support project, added a reference to it, and changed the parent class of Default.aspx.cs.
What should be written into the overridden OnSiteMapResolve event handler? I've been experimenting a lot, but I haven't been managed to change anything in the menu.

   protected override SiteMapNode OnSiteMapResolve(SiteMapResolveEventArgs e) {
      //...
   }

The event handler is surely called, because if a throw new Exception() line is inserted before the return, the exception is thrown. But neither the caption, nor the url of the menu items change. What is the solution?
0
pallosp
Asked:
pallosp
  • 7
  • 5
1 Solution
 
deanvanrooyenCommented:
sorry I havent looked at the codeproject stuff. I  might be way off here anyway but heres something: is it a binding issue?

the reason whay I asked this is because if you use a drag drop feature of visual studio for the menu and sitemap then you will have some issues with the binding of the menu -  that is if you try and make a change then the chnage is undone by the "automatic" binding of the control to the sitemap, you have to pay attention to the page life cycle and where exactly you make the changes as they must be made after the binding occurs.

try this add this to your aspx page -  this is where I would change stuff in the menu....

   protected override void OnPreRenderComplete(EventArgs e)
    {
        this.Menu1.Items[0].ChildItems[0].Text = "test";
        this.Menu1.Items[0].ChildItems[0].NavigateUrl = "test.html";
        base.OnPreRenderComplete(e);
    }
hope this helps
0
 
pallospAuthor Commented:
The menu is on the master page, so I can't access it directly.
Something is still wrong, because ((Menu)Master.FindControl("MainMenu")).Items.Count is 0.
0
 
deanvanrooyenCommented:


 Menu m = (Menu)this.Master.FindControl("MainMenu");

        m.Items[0].ChildItems[0].Text = "test";
        m.Items[0].ChildItems[0].NavigateUrl = "test.html";
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
pallospAuthor Commented:
I think m.Items contains the items created by the designer, not the items from the site map data source.
Probably this is the reason of that m.Items[0] doesn't exist.
0
 
pallospAuthor Commented:
I get the following error message:
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

Line 101:        m.Items[0].ChildItems[0].Text = "test";
0
 
deanvanrooyenCommented:
is m null? did it actually reference the menu?
0
 
pallospAuthor Commented:
m is not null, m.DataSourceID is "MainMenuDS" as it should be, but m.Items is a zero long collection.
m.DataSource is null.
0
 
deanvanrooyenCommented:
did you get any where?

how is the menu bound?
0
 
pallospAuthor Commented:
masterpage.master:

<asp:Menu ID="MainMenu" runat="server" DataSourceID="MainMenuDS" Orientation="Horizontal" >
     <StaticMenuItemStyle HorizontalPadding="2px" />
</asp:Menu>
<asp:SiteMapDataSource ID="MainMenuDS" runat="server" ShowStartingNode="False"/>

web.sitemap:

<?xml version="1.0" encoding="utf-8" ?>
<siteMap enableLocalization="true" xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
  <siteMapNode url="" title="Main"  description="" roles="*">
    <siteMapNode url="Default.aspx" title="Kezd&#337;lap" resourceKey="HomePage" />
    <siteMapNode url="rss.aspx" title="RSS" resourceKey="RSS" />
  </siteMapNode>
</siteMap>

The menu is bound to a SiteMapDataSource that reads the web.sitemap.
When Default.aspx is selected from the menu, I want to modify the url of the RSS link depending on the selected item of the radio button list.

Unfortunately I couldn't reach this behavior in the OnSiteMapResolve event no way.
0
 
pallospAuthor Commented:
TheLearnedOne: what is the condition of refunding points?
I'm not affected because of the unlimited points, just being curious.
0
 
deanvanrooyenCommented:
its a pity

the points are not the issue, why doesnt it work? I would like to know... can you load the project somewhere with just the basics of the page and code that is not working. there could be something else binding on the page that is causing some issues here.
0
 
pallospAuthor Commented:
I tried to reproduce the issue in a new project, and found the difference:
Because of the Intellisense I accidentally overrode the OnPreRender method instead of OnPreRenderComplete. In OnPreRender the menu isn't already filled by the sitemap.

Microsoft's solution at http://msdn2.microsoft.com/en-us/library/ms178425.aspx is still dead, the menu remains unchanged.

Thanks
0
 
Mayank_AgarwalCommented:
Hi Mate

Just checking on how diod you with this solution as i have a similar situtation where i got a home page that has two link that pass a querystring SiteID. when you click on that link it calls a master page that loads a menu depending on the querystring SiteID and on menu click it call the contents etc.
the problem that that when i select the link on the home page teh menu of the masterpage doesnt change, it shows me the same menu for all the siteID. though i have checked that the querystring is passed correctly etc.
0

Featured Post

Hire Technology Freelancers with Gigs

Work with freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely, and get projects done right.

  • 7
  • 5
Tackle projects and never again get stuck behind a technical roadblock.
Join Now