The following code will give any page the ability to be used as an rss feed automatically

Public class BasePage : System.Web.UI.Page
{
	protected override void Render(HtmlTextWriter writer)
	{
		if (Request.QueryString["rss"] == "true")
		{
			System.Text.StringBuilder sb = new System.Text.StringBuilder();
			System.IO.StringWriter sw = new System.IO.StringWriter(sb);
			HtmlTextWriter nw = new HtmlTextWriter(sw);
			Response.Clear();
			writer.Write("");
			writer.Write("");
			writer.Write(" ");
			writer.Write(" " + this.Request.Url.AbsoluteUri.ToString() + "");
			writer.Write(" ");
			writer.Write(" en-us");
			writer.Write(" " + DateTime.Now.ToUniversalTime().ToString() + "");
			writer.Write(" " + DateTime.Now.ToUniversalTime().ToString() + "");
			writer.Write(" ");
			writer.Write(" Dynamic page generator");
			
			writer.Write(" ");writer.Write(" " + this.Request.Url.AbsoluteUri.ToString() + "");
			writer.Write(" ");
			RenderChildren(nw);
			if (sb.ToString().IndexOf(" ") > 0)
			writer.Write(Util.StripHTML(sb.ToString().Substring(sb.ToString().IndexOf(""))));
			else
			writer.Write(Util.StripHTML(sb.ToString()));
			writer.Write("");
			writer.Write(" " + DateTime.Now.ToUniversalTime().ToString() + "");
			Guid g = new Guid();
			writer.Write(" " + g.ToString() + "");
			writer.Write(" ");writer.Write(" ");
		}
		else
		{
			base.Render(writer);
		}
	}
	
}
	public static class Util
	{
		public static string StripHTML(string htmlString)
		{
			string pattern = @"<(.\n)*?>";
			return Regex.Replace(htmlString.Replace(" ", " "), pattern, string.Empty);
		}
	}

So I tend to use Dotnetnuke alot for my side projects and its just generaly a good portal. But the default solpartmenu was always a creative challange making it look good. And the Asp.net menu provider seems to have a lot of code in it. So i looked around and saw some free menus, but they where always quirky… and when i used reflector on them i could see why. 

Which led to this posting. As you can see my code is always very simple, i hate re inventing the wheel. What this control is doing is populating the menuitemcollection.

using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI.WebControls;
namespace QuickMax.UI
{
public class DnnAspNetMenu : System.Web.UI.WebControls.Menu
{
DotNetNuke.Entities.Modules.PortalModuleBase _DnnBase;
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
_DnnBase = new DotNetNuke.Entities.Modules.PortalModuleBase();
foreach (DotNetNuke.Entities.Tabs.TabInfo tab in _DnnBase.PortalSettings.DesktopTabs)
{
if (tab.IsVisible &amp;&amp; tab.Level == 0)
{
bool badd = false;
foreach (DotNetNuke.Security.Permissions.TabPermissionInfo tbi in tab.TabPermissions)
if (_DnnBase.UserInfo.IsInRole(tbi.RoleName))
badd = true;
if (badd)
{
MenuItem mnuItem = new MenuItem();
mnuItem.Text = tab.TabName;
mnuItem.NavigateUrl = tab.FullUrl;

mnuItem.Selected = tab.TabID.Equals(_DnnBase.PortalSettings.ActiveTab.TabID);FillChildren(ref mnuItem, tab);
this.Items.Add(mnuItem);
}
}
}
}
private void FillChildren(ref MenuItem mnuitem, DotNetNuke.Entities.Tabs.TabInfo parent)
{
foreach (DotNetNuke.Entities.Tabs.TabInfo tab in _DnnBase.PortalSettings.DesktopTabs)
{
if (parent.TabID == tab.ParentId)
{
bool badd = false;
foreach (DotNetNuke.Security.Permissions.TabPermissionInfo tbi in tab.TabPermissions)
if (_DnnBase.UserInfo.IsInRole(tbi.RoleName))
badd = true;
if (badd)
{
MenuItem mnuItem = new MenuItem();
mnuItem.Text = tab.TabName;
mnuItem.NavigateUrl = tab.FullUrl;

mnuItem.Selected = tab.TabID.Equals(_DnnBase.PortalSettings.ActiveTab.TabID);FillChildren(ref mnuItem, tab);
mnuitem.ChildItems.Add(mnuItem);
}
}
}
}
}
}

I found these two articles very informative, In many of my project the user log in through a form and are validated against AD. From there i would create a NetworkCredential that i would pass to the sql reporting webservice. This is another method you can use to provide sql reports with out having to hit add.

Using Forms Authentication in Reporting Services:
http://msdn2.microsoft.com/en-us/library/aa902691(sql.80).aspx

Using SQL Reporting Services 2005 and Forms Authentication with the Whidbey/2.0 SQLMembershipProvider
http://blogs.msdn.com/bimusings/archive/2005/12/05/500195.aspx