Solved

Change menu programmatically

Posted on 2006-06-12
15
646 Views
Last Modified: 2012-08-14
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
Comment
Question by:pallosp
  • 7
  • 5
15 Comments
 
LVL 12

Accepted Solution

by:
deanvanrooyen earned 500 total points
ID: 16891914
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
 
LVL 9

Author Comment

by:pallosp
ID: 16892003
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
 
LVL 12

Expert Comment

by:deanvanrooyen
ID: 16895846


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

        m.Items[0].ChildItems[0].Text = "test";
        m.Items[0].ChildItems[0].NavigateUrl = "test.html";
0
Windows Server 2016: All you need to know

Learn about Hyper-V features that increase functionality and usability of Microsoft Windows Server 2016. Also, throughout this eBook, you’ll find some basic PowerShell examples that will help you leverage the scripts in your environments!

 
LVL 9

Author Comment

by:pallosp
ID: 16896840
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
 
LVL 9

Author Comment

by:pallosp
ID: 16896872
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
 
LVL 12

Expert Comment

by:deanvanrooyen
ID: 16908331
is m null? did it actually reference the menu?
0
 
LVL 9

Author Comment

by:pallosp
ID: 16909774
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
 
LVL 12

Expert Comment

by:deanvanrooyen
ID: 17100679
did you get any where?

how is the menu bound?
0
 
LVL 9

Author Comment

by:pallosp
ID: 17101037
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
 
LVL 9

Author Comment

by:pallosp
ID: 17101054
TheLearnedOne: what is the condition of refunding points?
I'm not affected because of the unlimited points, just being curious.
0
 
LVL 12

Expert Comment

by:deanvanrooyen
ID: 17103348
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
 
LVL 9

Author Comment

by:pallosp
ID: 17103964
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
 
LVL 1

Expert Comment

by:Mayank_Agarwal
ID: 20811293
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

U.S. Department of Agriculture and Acronis Access

With the new era of mobile computing, smartphones and tablets, wireless communications and cloud services, the USDA sought to take advantage of a mobilized workforce and the blurring lines between personal and corporate computing resources.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Lots of people ask this question on how to extend the “MembershipProvider” to make use of custom authentication like using existing database or make use of some other way of authentication. Many blogs show you how to extend the membership provider c…
ASP.Net to Oracle Connectivity Recently I had to develop an ASP.NET application connecting to an Oracle database.As I am doing it first time ,I had to solve several problems. This article will help to such developers  to develop an ASP.NET client…
This video shows how to quickly and easily add an email signature for all users on Exchange 2016. The resulting signature is applied on a server level by Exchange Online. The email signature template has been downloaded from: www.mail-signatures…
The Email Laundry PDF encryption service allows companies to send confidential encrypted  emails to anybody. The PDF document can also contain attachments that are embedded in the encrypted PDF. The password is randomly generated by The Email Laundr…

832 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question