<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ShowUsYour&amp;lt;Blog&amp;gt; : Whidbey</title><link>http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx</link><description>Tags: Whidbey</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><item><title>RegexLib V2 - now with added ASP.NET V2 :)</title><link>http://weblogs.asp.net/dneimke/archive/2005/06/10/411068.aspx</link><pubDate>Thu, 09 Jun 2005 20:56:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:411068</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=411068</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/06/10/411068.aspx#comments</comments><description>&lt;p&gt;The other day I posted a blog entry about the migration of RegexLib to ASP.NET V2 - the article can be found here:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://markitup.com/Blog/archive/2005/06/07/50.aspx"&gt;http://markitup.com/Blog/archive/2005/06/07/50.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;In the coming week I'm planning to post a source code viewer so that you can see how that site has been put together and I'm also planning to release a couple of articles (not sure where yet) - the first of which will be an article describing how I migrated the existing users into the new Membership feature.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=411068" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Regex/default.aspx">Regex</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>ASP 2 Quickstarts </title><link>http://weblogs.asp.net/dneimke/archive/2005/04/05/397121.aspx</link><pubDate>Mon, 04 Apr 2005 23:48:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:397121</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=397121</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/04/05/397121.aspx#comments</comments><description>&lt;p&gt;Very Nice!&lt;/p&gt; &lt;p&gt;&lt;a href="http://beta.asp.net/quickstart/aspnet/Default.aspx"&gt;http://beta.asp.net/quickstart/aspnet/Default.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=397121" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>What CommandName's to use in a FormView</title><link>http://weblogs.asp.net/dneimke/archive/2005/04/02/396722.aspx</link><pubDate>Fri, 01 Apr 2005 20:31:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:396722</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=396722</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/04/02/396722.aspx#comments</comments><description>&lt;p&gt;taken from&amp;nbsp;&lt;a href="http://fredrik.nsquared2.com/viewpost.aspx?PostID=102"&gt;Fredrik's 
blog&lt;/a&gt;:&lt;/p&gt;
&lt;hr&gt;

&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;Paging:&lt;?xml:namespace prefix="o" ns="urn:schemas-microsoft-com:office:office"?&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;o:p&gt;&lt;font face="Verdana" size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;Next&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;Prev&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;First&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;Last&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;o:p&gt;&lt;font face="Verdana" size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;The FormView 
has support for paging so we don’t really need to add button controls for those 
commands. We only need to use those if we want to create our own custom 
paging.&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;o:p&gt;&lt;font face="Verdana" size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;For changing 
modes:&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;o:p&gt;&lt;font face="Verdana" size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;New&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;Cancel&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;Edit&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;o:p&gt;&lt;font face="Verdana" size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;The 
&lt;strong&gt;New&lt;/strong&gt; command will change the mode of the FormView to the Insert 
mode. The &lt;strong&gt;Cancel&lt;/strong&gt; will turn back the mode to its default mode. 
The &lt;strong&gt;Edit&lt;/strong&gt; will turn the mode into Edit 
mode.&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;o:p&gt;&lt;font face="Verdana" size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;For 
actions:&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;o:p&gt;&lt;font face="Verdana" size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;Insert&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;Delete&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;&lt;strong&gt;Update&lt;o:p&gt;&lt;/o:p&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;o:p&gt;&lt;font face="Verdana" size="2"&gt;&amp;nbsp;&lt;/font&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"&gt;&lt;span lang="EN-GB" style="mso-ansi-language: EN-GB"&gt;&lt;font face="Verdana"&gt;&lt;font size="2"&gt;When we press a 
button with the &lt;strong&gt;Insert&lt;/strong&gt; command specified the FormView will 
execute the associated DataSource control’s InsertCommand. If the CommandName of 
the button is set to &lt;strong&gt;Delete&lt;/strong&gt; or &lt;strong&gt;Update&lt;/strong&gt; the 
DataSource’s DeleteCommand or UpdateCommand will be executed. By default the 
SelectCommand of the DataSource control will be 
executed.&lt;o:p&gt;&lt;/o:p&gt;&lt;/font&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=396722" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Using generics to build generic data logic layers</title><link>http://weblogs.asp.net/dneimke/archive/2005/03/29/396120.aspx</link><pubDate>Tue, 29 Mar 2005 08:12:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:396120</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=396120</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/03/29/396120.aspx#comments</comments><description>&lt;p&gt;Consider exposing raw Generic collections from your data logic layers, such 
as:&lt;/p&gt;&lt;pre&gt;   &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; PersonManager {
        ...
        &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; List&amp;lt;Person&amp;gt; ListPeople(...) { ... } ;
   }&lt;/pre&gt;
&lt;p&gt;When I started messing around with building applications in 2.0 I quickly 
wrapped Generic collections like so:&lt;/p&gt;&lt;pre&gt;  &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; PersonCollection : List&amp;lt;Person&amp;gt; {
     ... 
  }&lt;/pre&gt;
&lt;p&gt;This was normally done so that I could hang a Sort method off of them:&lt;/p&gt;&lt;pre&gt;  &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;class&lt;/span&gt; PersonCollection : List&amp;lt;Person&amp;gt;, IBidirectionalSort {
     ... 
     &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Sort( &lt;span style="COLOR: blue"&gt;string&lt;/span&gt; sortExpression, &lt;span style="COLOR: blue"&gt;bool&lt;/span&gt; isAscending ) { ... }
  } 

&lt;/pre&gt;
&lt;p&gt;The downside of this approach is that you end up writing fiddly code around 
calls to generic helper methods.&lt;/p&gt;
&lt;p&gt;As an example, let's say that I write a nice generic helper method to page my 
collections:&lt;/p&gt;&lt;pre&gt;    &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; &lt;span style="COLOR: blue"&gt;static&lt;/span&gt; &lt;span style="COLOR: blue"&gt;void&lt;/span&gt; Page(&lt;span style="COLOR: blue"&gt;ref&lt;/span&gt; List&amp;lt;T&amp;gt; data, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; maximumRows, &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; startRowIndex) 
        where T : IDataObject, &lt;span style="COLOR: blue"&gt;new&lt;/span&gt;() {

        &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (data.Count &amp;gt; &lt;span style="COLOR: maroon"&gt;0&lt;/span&gt;) {
            &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (maximumRows &amp;gt; &lt;span style="COLOR: maroon"&gt;0&lt;/span&gt; &amp;amp;&amp;amp; startRowIndex &amp;gt;= &lt;span style="COLOR: maroon"&gt;0&lt;/span&gt;) {
                List&amp;lt;T&amp;gt; tmpColl = &lt;span style="COLOR: blue"&gt;null&lt;/span&gt;;

                &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; remainingRowCount = data.Count - startRowIndex;
                &lt;span style="COLOR: blue"&gt;int&lt;/span&gt; count = (remainingRowCount &amp;gt;= maximumRows) ? maximumRows : remainingRowCount;

                &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (count &amp;gt; &lt;span style="COLOR: maroon"&gt;0&lt;/span&gt;) {
                    tmpColl = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; List&amp;lt;T&amp;gt;();
                    tmpColl.AddRange(data.GetRange(startRowIndex, count));
                }
                data = tmpColl;
            }
        }
    }
&lt;/pre&gt;
&lt;p&gt;If I’ve wrapped my collection – as per the PersonCollection example – then 
using the generic Page method will require temporary object creation when I’m 
calling it, something like:&lt;/p&gt;&lt;pre&gt;   &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; PersonCollection ListPeople(...) { 
       ...
       PersonCollection people = &lt;strong&gt;FillList&lt;/strong&gt;( reader ) ;
       List&amp;lt;Person&amp;gt; tmp = &lt;strong&gt;Page&lt;/strong&gt;( people, &lt;span style="COLOR: maroon"&gt;20&lt;/span&gt;, &lt;span style="COLOR: maroon"&gt;0&lt;/span&gt; ) ;
       PersonCollection peopleToReturn = &lt;span style="COLOR: blue"&gt;new&lt;/span&gt; PersonCollection() ;
       peopleToReturn.AddRange( tmp ) ;
       &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; peopleToReturn ;
   }&lt;/pre&gt;
&lt;p&gt;So, you can see that by the time we have many generic methods, working with 
temporary objects becomes cumbersome.&amp;nbsp; Exposing List&amp;lt;Person&amp;gt; from 
this method would lead you to build your surrounding methods – such as FillList 
and Page – to work with your code better but will also lead to leaner code:&lt;/p&gt;&lt;pre&gt;    &lt;span style="COLOR: blue"&gt;public&lt;/span&gt; List&amp;lt;Person&amp;gt; ListPeople(...) { 
       ...
       List&amp;lt;Person&amp;gt; people = &lt;strong&gt;FillList&lt;/strong&gt;&amp;lt;Person&amp;gt;( reader ) ;
       &lt;span style="COLOR: blue"&gt;return&lt;/span&gt; &lt;strong&gt;Page&lt;/strong&gt;&amp;lt;Person&amp;gt;( people, &lt;span style="COLOR: maroon"&gt;20&lt;/span&gt;, &lt;span style="COLOR: maroon"&gt;0&lt;/span&gt; ) ;
    }&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=396120" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Using the SiteMapDataSource to display lists of links</title><link>http://weblogs.asp.net/dneimke/archive/2005/03/29/396103.aspx</link><pubDate>Tue, 29 Mar 2005 00:09:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:396103</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>6</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=396103</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/03/29/396103.aspx#comments</comments><description>&lt;p&gt;Danny Chen just blogged about the SiteMap and showed some interesting ways to make use of custom attributes:&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;A href="http://weblogs.asp.net/dannychen/archive/2005/03/28/396099.aspx"&gt;http://weblogs.asp.net/dannychen/archive/2005/03/28/396099.aspx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;There's another one that I'd like to add to this list.&amp;nbsp; Commonly people are using UL elements to create navigational links because they require less Html to be emitted in the page and are easily styled into nice looking links.&amp;nbsp; This is the approach that modern applications such as CommunityServer and &lt;a title="ProjectDistributor" href="http://ProjectDistributor.net" &gt;ProjectDistributor&lt;/a&gt; use for their lists of links.&amp;nbsp; So how would you do that with a SiteMap?&amp;nbsp; The answer is actually pretty simple because you can bind a SiteMapDataSource directly to a Repeater.&lt;/p&gt; &lt;p&gt;&amp;nbsp; &amp;lt;ul&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Repeater DataSourceId="myDataSource" ...&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href='&amp;lt;%# Eval("Url") %&amp;gt;'&amp;gt;&amp;lt;%# Eval("Title") %&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/li&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemTemplate&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/asp:Repeater&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/ul&amp;gt;&lt;/p&gt; &lt;p&gt;&amp;lt;asp:SiteMapDataSource id="myDataSource" runat="server" ShowStartingNode="false" /&amp;gt;&lt;/p&gt; &lt;p&gt;That will give you a nice list of clickable links.&lt;/p&gt; &lt;p&gt;On my site I actually only required a subset of the items in the SiteMap to be rendered on a specific menu.&amp;nbsp; For example, I had a left navigation menu which only displays a subset of the total items.&amp;nbsp; In this case I can use the technique that Danny showed off by adding a custom attribute to my SiteMapNode's like so:&lt;/p&gt; &lt;p&gt;&amp;nbsp; &amp;lt;?xml version="1.0" encoding="utf-8" ?&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;siteMap xmlns="&lt;a href="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"&gt;http://schemas.microsoft.com/AspNet/SiteMap-File-1.0&lt;/a&gt;" &amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;siteMapNode url="Home.aspx" title="Home"&amp;nbsp; DisplayOnLeft="true"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;siteMapNode url="Work.aspx" title="Work" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;siteMapNode url="School.aspx" title="School" DisplayOnLeft="true" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/siteMapNode&amp;gt;&lt;br /&gt;&amp;nbsp; &amp;lt;/siteMap&amp;gt;&lt;/p&gt; &lt;p&gt;So, you can see that 2 of the nodes contain a DisplayOnLeft attribute which is set to true.&amp;nbsp; Now, to conditionally display those items in my sidebar navigation list I can hook the Repeater's ItemDataBound event and write logic like so...&lt;/p&gt; &lt;p&gt;&amp;nbsp; SiteMapNode node = e.Item.DataItem as SiteMapNode ;&lt;br /&gt;&amp;nbsp; string display = node["DisplayOnLeft"];&lt;br /&gt;&amp;nbsp; if( string.IsEmptyOrNull( display ) || display != "true" ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.Item.Visible = false ;&lt;br /&gt;&amp;nbsp; }&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=396103" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Bookmarks/default.aspx">Bookmarks</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Getting ASP.NET Membership running against your own database</title><link>http://weblogs.asp.net/dneimke/archive/2005/03/26/395936.aspx</link><pubDate>Sat, 26 Mar 2005 09:33:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:395936</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=395936</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/03/26/395936.aspx#comments</comments><description>&amp;nbsp;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;If 
you want to install the ASP.NET V2 tables and procedures for things such as 
Membership, &lt;a title="" href="http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=CE84B6A9-C4C5-41B5-A884-17856C892F50" &gt;Personalization&lt;/a&gt;, etc you need to run the aspnet_regsql.exe tool 
against your database.&lt;span style="mso-spacerun: yes"&gt;&amp;nbsp; &lt;/span&gt;The tool can 
be found in the %windir%\Microsoft.NET\Framework\{FRAMEWORKVERSION} folder.&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;Once 
you've run that tool, then it's just a matter of replacing the ConnectionString 
entry in your web.config file to point to your database:&lt;/p&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;&amp;nbsp;&lt;/p&gt;&lt;pre&gt;&lt;pre&gt;  &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;configuration&lt;/span&gt; &lt;span style="COLOR: red"&gt;xmlns&lt;/span&gt;="&lt;span style="COLOR: blue"&gt;http://schemas.microsoft.com/.NetConfiguration/v2.0&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;

    &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;connectionStrings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
      &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;remove&lt;/span&gt; &lt;span style="COLOR: red"&gt;name&lt;/span&gt;="&lt;span style="COLOR: blue"&gt;LocalSqlServer&lt;/span&gt;" /&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
      &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: maroon"&gt;add&lt;/span&gt; &lt;span style="COLOR: red"&gt;connectionString&lt;/span&gt;="&lt;span style="COLOR: blue"&gt;CONN STRING&lt;/span&gt;" &lt;span style="COLOR: red"&gt;name&lt;/span&gt;="&lt;span style="COLOR: blue"&gt;LocalSqlServer&lt;/span&gt;" &lt;span style="COLOR: red"&gt;providerName&lt;/span&gt;="&lt;span style="COLOR: blue"&gt;System.Sql.DbClient&lt;/span&gt;" /&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="COLOR: maroon"&gt;connectionStrings&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;

  &lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;/&lt;span style="COLOR: maroon"&gt;configuration&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/pre&gt;
&lt;p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: Verdana; mso-outline-level: 1"&gt;After 
that,&amp;nbsp;the built-in API's will read and write&amp;nbsp;from your database for 
that application.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=395936" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Health monitoring in ASP.NET V2</title><link>http://weblogs.asp.net/dneimke/archive/2005/02/24/379131.aspx</link><pubDate>Wed, 23 Feb 2005 21:41:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:379131</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=379131</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/02/24/379131.aspx#comments</comments><description>&lt;p&gt;Here's a couple of nice articles about the new HealthMonitoring feature in 
Whidbey:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://weblogs.asp.net/dr.netjes/archive/2004/12/09/279101.aspx"&gt;http://weblogs.asp.net/dr.netjes/archive/2004/12/09/279101.aspx&lt;/a&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;a href="http://msmvps.com/gbvb/archive/2004/09/15/13578.aspx"&gt;http://msmvps.com/gbvb/archive/2004/09/15/13578.aspx&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Definitely worth a read as this makes it super-easy to put custom logging 
code into your applications.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=379131" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>The sexy new web</title><link>http://weblogs.asp.net/dneimke/archive/2005/02/22/377768.aspx</link><pubDate>Tue, 22 Feb 2005 02:39:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:377768</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=377768</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/02/22/377768.aspx#comments</comments><description>&lt;p&gt;A nice article about how we are starting to expand and build smarter, richer applications on the web.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://adaptivepath.com/publications/essays/archives/000385.php"&gt;http://adaptivepath.com/publications/essays/archives/000385.php&lt;/a&gt;&lt;/p&gt; &lt;p&gt;I know that I've said this before but, articles such as this really emphasize how the ASP.NET team have got it right with what they are delivering in Whidbey.&amp;nbsp; Things such as the client-side scripting callbacks will bring the ability to produce a "GMail"-type experience within the reach of many more developers and, as a result, we will start to enjoy a new breed of applications.&lt;/p&gt; &lt;p&gt;We've been focussing a lot of energy looking into how to incorporate smart design such as this into our new blogging application for performing tasks such as spell-checking to reduce the instances of unneccessary round-tripping.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=377768" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Javascript/default.aspx">Javascript</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/OneIsABlog/default.aspx">OneIsABlog</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Web+Forms/default.aspx">Web Forms</category><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Post-Cache substitution sample</title><link>http://weblogs.asp.net/dneimke/archive/2005/02/15/372891.aspx</link><pubDate>Tue, 15 Feb 2005 11:30:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:372891</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=372891</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/02/15/372891.aspx#comments</comments><description>
&lt;p&gt;Having read Nikhil's great post about this topic recently, I thought that I'd 
add a working demo of that sample to the Whidbey group on &lt;a title="ProjectDistributor" href="http://ProjectDistributor.net"&gt;ProjectDistributor&lt;/a&gt;.&amp;nbsp; You can grab 
the source here.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://projectdistributor.net/Projects/Project.aspx?projectId=75"&gt;http://projectdistributor.net/Projects/Project.aspx?projectId=75&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=372891" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item><item><title>Fredrik has just released a new cut of PermissionManager</title><link>http://weblogs.asp.net/dneimke/archive/2005/02/08/368702.aspx</link><pubDate>Mon, 07 Feb 2005 22:28:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:368702</guid><dc:creator>digory</dc:creator><author>digory</author><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://weblogs.asp.net/dneimke/rsscomments.aspx?PostID=368702</wfw:commentRss><comments>http://weblogs.asp.net/dneimke/archive/2005/02/08/368702.aspx#comments</comments><description>&lt;p&gt;You can read his announcement here:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;a href="http://fredrik.nsquared2.com/viewpost.aspx?PostID=279"&gt;http://fredrik.nsquared2.com/viewpost.aspx?PostID=279&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Fredrik is doing some awesome stuff with ASP.NET V2 and this project is a 
great example of that.&amp;nbsp; If you want to learn about how - and possibly why - 
you would want to implement your own provider for a set of data access 
functionality such as this, then I highly recommend this code as a good 
example.&lt;/p&gt;
&lt;p&gt;The code demonstrates how to create and initialize the provider, how to work 
with the configuration settings and how to interract with the proivider via a 
business manager object.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=368702" width="1" height="1"&gt;</description><category domain="http://weblogs.asp.net/dneimke/archive/tags/Whidbey/default.aspx">Whidbey</category></item></channel></rss>