<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
    <channel>
        <title>mostlylucid</title>
        <link>http://mostlylucid.net/Default.aspx</link>
        <description>scott galloway's personal blog...</description>
        <language>en-US</language>
        <copyright>Scott Galloway</copyright>
        <managingEditor>blogcomments@mostlylucid.co.uk</managingEditor>
        <generator>Subtext Version 2.0.0.43</generator>
        <image>
            <title>mostlylucid</title>
            <url>http://mostlylucid.net/images/RSS2Image.gif</url>
            <link>http://mostlylucid.net/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <geo:lat>47.671346</geo:lat><geo:long>-122.341662</geo:long><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/mostlylucid/XRDO" type="application/rss+xml" /><feedburner:emailServiceId>1998827</feedburner:emailServiceId><feedburner:feedburnerHostname>http://www.feedburner.com</feedburner:feedburnerHostname><item>
            <title>The BPA -Seattle...an aural pick-me-up for the mortally jaded...</title>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/453842415/the-bpa-seattle.an-aural-pick-me-up-for-the-mortally-jaded.aspx</link>
            <description>&lt;p&gt;&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Q-Tz2kI_4mU&amp;amp;hl=en&amp;amp;fs=1" /&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;embed src="http://www.youtube.com/v/Q-Tz2kI_4mU&amp;amp;hl=en&amp;amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344" /&gt;&lt;/object&gt;&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1304.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=oDSPN"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=oDSPN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=jksAn"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=jksAn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=S5soN"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=S5soN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=pP4Ln"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=pP4Ln" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=pOeYN"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=pOeYN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/453842415" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/11/15/the-bpa-seattle.an-aural-pick-me-up-for-the-mortally-jaded.aspx</guid>
            <pubDate>Sat, 15 Nov 2008 09:19:26 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1304.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/11/15/the-bpa-seattle.an-aural-pick-me-up-for-the-mortally-jaded.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1304.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1304.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F11%2F15%2Fthe-bpa-seattle.an-aural-pick-me-up-for-the-mortally-jaded.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/11/15/the-bpa-seattle.an-aural-pick-me-up-for-the-mortally-jaded.aspx</feedburner:origLink></item>
        <item>
            <title>Way too much information on Control IDs and ASP.NET 4.0 Client Id Enhancements</title>
            <category>ASP.NET</category>
            <category>Long &amp; Rambling</category>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/441426174/way-too-much-information-on-control-ids-and-asp.net-4.0.aspx</link>
            <description>&lt;p&gt;Of of the ASP.NET enhancements which first made an appearance in the Visual Studio 2010 PDC CTP release  is the ability to set a client Id which you can be confident will be used when the control renders it’s markup.    &lt;br /&gt;All of the samples in this post will use the following Server Control:&lt;/p&gt;  &lt;div style="font-size: 10pt; background: white; color: black; font-family: calibri"&gt;   &lt;div style="font-size: 10pt; background: white; color: black; font-family: calibri"&gt;     &lt;div style="font-size: 10pt; background: white; color: black; font-family: calibri"&gt;       &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.UI;&lt;/p&gt;        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;/p&gt;        &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;namespace&lt;/span&gt; TestControls&lt;/p&gt;        &lt;p style="margin: 0px"&gt;{&lt;/p&gt;        &lt;p style="margin: 0px"&gt;    &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NamingPanel&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Panel&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;INamingContainer&lt;/span&gt;&lt;/p&gt;        &lt;p style="margin: 0px"&gt;    { }&lt;/p&gt;        &lt;p style="margin: 0px"&gt;}&lt;/p&gt;        &lt;p style="margin: 0px"&gt; &lt;/p&gt;        &lt;p style="margin: 0px"&gt;&lt;font size="3"&gt;&lt;em&gt;NamingPanel&lt;/em&gt; is very simple server control which just enables us to see the effect of ClientId without all the cruft that goes with using a more complex control (e.g, GridView).&lt;/font&gt;&lt;/p&gt;        &lt;h2&gt;How does the Control Id get defined now?&lt;/h2&gt;        &lt;p style="margin: 0px"&gt;&lt;font size="3" /&gt;&lt;/p&gt;        &lt;p&gt;&lt;font size="3"&gt;When used with a ‘nested’ &lt;em&gt;NamingPanel&lt;/em&gt;, the following markup:&lt;/font&gt;&lt;/p&gt;        &lt;p&gt;&lt;font size="3"&gt;&amp;lt;tc:NamingPanel runat="server" id="rootPanel"&amp;gt;            &lt;br /&gt;    &amp;lt;tc:NamingPanel runat="server" id="childPanel1"&amp;gt;             &lt;br /&gt;    &amp;lt;asp:TextBox ID="TextBox" runat="server" Text="Hello!"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;             &lt;br /&gt;    &amp;lt;/tc:NamingPanel&amp;gt;             &lt;br /&gt;&amp;lt;/tc:NamingPanel&amp;gt;&lt;/font&gt;&lt;/p&gt;     &lt;/div&gt;      &lt;div style="font-size: 10pt; background: white; color: black; font-family: calibri"&gt;&lt;font size="3" /&gt;&lt;/div&gt;      &lt;div style="font-size: 10pt; background: white; color: black; font-family: calibri"&gt;&lt;font size="3"&gt;results in this rendered HTML:&lt;/font&gt;&lt;/div&gt;      &lt;p style="margin: 0px" /&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p /&gt;  &lt;p&gt;&lt;font size="3"&gt;  &amp;lt;div id="Div1"&amp;gt;  &lt;br /&gt;       &amp;lt;div id="rootPanel_childPanel1"&amp;gt;       &lt;br /&gt;        &amp;lt;input name="rootPanel$childPanel1$TextBox" type="text" value="Hello!" id="rootPanel_childPanel1_TextBox" /&amp;gt;       &lt;br /&gt;    &amp;lt;/div&amp;gt;       &lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;As you can see the id “TextBox” defined in the original markup gets mangled to  preserve ‘uniqueness’ by including the Ids of it’s parent controls within it’s own id attribute.    &lt;br /&gt;Whilst making the id attribute ‘unique’ does ensure that we can ensure that selecting a specific control client side using the id attribute will result in a single control, it does tend to get a bit verbose; the example above is only 2 levels deep, with more nesting; or even just using a control in  &lt;a href="http://msdn.microsoft.com/en-us/library/x2b3ktt7.aspx"&gt;Nested MasterPages&lt;/a&gt; can result in hugely long values for the Client Id…&lt;/p&gt;  &lt;p&gt;The second major problem with the ‘unique’ Client Ids is that you can’t guarantee that your client Id will remain the same if you move a control from one ‘NamingContainer’ to another.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; A NamingContainer is a control which either directly or indirectly implements the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer(VS.71).aspx"&gt;INamingContainer&lt;/a&gt; interface. In essence it defines a ‘NameSpace’ for controls…you’d most commonly implement this interface on &lt;a href="http://msdn.microsoft.com/en-us/library/aa719734(VS.71).aspx"&gt;Composite Server Controls&lt;/a&gt; to ensure that  any of the contained child controls are rendered with the parent ids prefixing their own Ids, ensuring they remain unique within the page.&lt;/p&gt;  &lt;p&gt;What happens if you don’t specify an ‘id’ for one of these parent controls in markup? Given the following markup:&lt;/p&gt;  &lt;p&gt;&amp;lt;tc:NamingPanel runat="server" id="rootPanel"&amp;gt;    &lt;br /&gt;    &amp;lt;tc:NamingPanel runat="server"&amp;gt;     &lt;br /&gt;    &amp;lt;asp:TextBox ID="TextBox" runat="server" Text="Hello!"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;     &lt;br /&gt;    &amp;lt;/tc:NamingPanel&amp;gt;     &lt;br /&gt;&amp;lt;/tc:NamingPanel&amp;gt;&lt;/p&gt;  &lt;p&gt;results in this rendered HTML:&lt;/p&gt;  &lt;p&gt;&amp;lt;div id="rootPanel"&amp;gt;    &lt;br /&gt;   &amp;lt;div&amp;gt;     &lt;br /&gt;       &amp;lt;input name="rootPanel$ctl00$TextBox" type="text" value="Hello!" id="rootPanel_ctl00_TextBox" /&amp;gt;     &lt;br /&gt;   &amp;lt;/div&amp;gt;     &lt;br /&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;  &lt;p&gt;Taking a look at the id for the TextBox you can see that there’s an odd name inserted in the id attribute “ctl00”, where did this come form? Well, in the System.Web.UI.Control class there’s a declaration as follows (note, this and all other source in the post is from the ASP.NET 2.0 source using &lt;a href="http://www.red-gate.com/products/reflector/"&gt;Reflector&lt;/a&gt;):&lt;/p&gt;  &lt;div style="font-size: 10pt; background: white; color: black; font-family: calibri"&gt;   &lt;p style="margin: 0px"&gt;  &lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;static&lt;/span&gt; &lt;span style="color: blue"&gt;readonly&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] automaticIDs = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt;[] { &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color: #a31515"&gt;"ctl00"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl01"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl02"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl03"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl04"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl05"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl06"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl07"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl08"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl09"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl10"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl11"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl12"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl13"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl14"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl15"&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color: #a31515"&gt;"ctl16"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl17"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl18"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl19"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl20"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl21"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl22"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl23"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl24"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl25"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl26"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl27"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl28"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl29"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl30"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl31"&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color: #a31515"&gt;"ctl32"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl33"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl34"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl35"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl36"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl37"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl38"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl39"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl40"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl41"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl42"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl43"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl44"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl45"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl46"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl47"&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color: #a31515"&gt;"ctl48"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl49"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl50"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl51"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl52"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl53"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl54"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl55"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl56"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl57"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl58"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl59"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl60"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl61"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl62"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl63"&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color: #a31515"&gt;"ctl64"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl65"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl66"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl67"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl68"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl69"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl70"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl71"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl72"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl73"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl74"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl75"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl76"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl77"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl78"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl79"&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color: #a31515"&gt;"ctl80"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl81"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl82"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl83"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl84"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl85"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl86"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl87"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl88"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl89"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl90"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl91"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl92"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl93"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl94"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl95"&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color: #a31515"&gt;"ctl96"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl97"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl98"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl99"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl100"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl101"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl102"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl103"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl104"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl105"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl106"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl107"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl108"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl109"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl110"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl111"&lt;/span&gt;, &lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color: #a31515"&gt;"ctl112"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl113"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl114"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl115"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl116"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl117"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl118"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl119"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl120"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl121"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl122"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl123"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl124"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl125"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl126"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"ctl127"&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;     };&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;As you can see this defines an array containing some predefined IDs to be used when no id is specified for a control; again, this retains uniqueness for control names. At runtime the ID for the control is generated by reading the ‘UniqueID’ property of the Control class.&lt;/p&gt;  &lt;div style="font-size: 10pt; background: white; color: black; font-family: calibri"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;virtual&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; UniqueID&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        &lt;span style="color: blue"&gt;get&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._cachedUniqueID == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                Control namingContainer = &lt;span style="color: blue"&gt;this&lt;/span&gt;.NamingContainer;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color: blue"&gt;if&lt;/span&gt; (namingContainer == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;._id;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._id == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    &lt;span style="color: blue"&gt;this&lt;/span&gt;.GenerateAutomaticID();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.Page == namingContainer)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    &lt;span style="color: blue"&gt;this&lt;/span&gt;._cachedUniqueID = &lt;span style="color: blue"&gt;this&lt;/span&gt;._id;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    &lt;span style="color: blue"&gt;string&lt;/span&gt; uniqueIDPrefix = namingContainer.GetUniqueIDPrefix();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    &lt;span style="color: blue"&gt;if&lt;/span&gt; (uniqueIDPrefix.Length == 0)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                        &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;._id;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                    &lt;span style="color: blue"&gt;this&lt;/span&gt;._cachedUniqueID = uniqueIDPrefix + &lt;span style="color: blue"&gt;this&lt;/span&gt;._id;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;                }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: blue"&gt;this&lt;/span&gt;._cachedUniqueID;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;        }&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    }&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font size="3"&gt;As you can see this code has the following check:&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;    &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;._id == &lt;span style="color: blue"&gt;null&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    {&lt;/p&gt;    &lt;p style="margin: 0px"&gt;            &lt;span style="color: blue"&gt;this&lt;/span&gt;.GenerateAutomaticID();&lt;/p&gt;    &lt;p style="margin: 0px"&gt;    }&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;font size="3"&gt;Simply, if there’s no id already in existence for the control at render time then one is generated using a call to the following method:&lt;/font&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;p style="margin: 0px"&gt; &lt;/p&gt;    &lt;div style="font-size: 10pt; background: white; color: black; font-family: calibri"&gt;     &lt;p style="margin: 0px"&gt;&lt;span style="color: blue"&gt;private&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; GenerateAutomaticID()&lt;/p&gt;      &lt;p style="margin: 0px"&gt;{&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    &lt;span style="color: blue"&gt;this&lt;/span&gt;.flags.Set(0x200000);&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    &lt;span style="color: blue"&gt;this&lt;/span&gt;._namingContainer.EnsureOccasionalFields();&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    &lt;span style="color: blue"&gt;int&lt;/span&gt; index = &lt;span style="color: blue"&gt;this&lt;/span&gt;._namingContainer._occasionalFields.NamedControlsID++;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    &lt;span style="color: blue"&gt;if&lt;/span&gt; (&lt;span style="color: blue"&gt;this&lt;/span&gt;.EnableLegacyRendering)&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    {&lt;/p&gt;      &lt;p style="margin: 0px"&gt;        &lt;span style="color: blue"&gt;this&lt;/span&gt;._id = &lt;span style="color: #a31515"&gt;"_ctl"&lt;/span&gt; + index.ToString(NumberFormatInfo.InvariantInfo);&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    }&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    &lt;span style="color: blue"&gt;else&lt;/span&gt; &lt;span style="color: blue"&gt;if&lt;/span&gt; (index &amp;lt; 0x80)&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    {&lt;/p&gt;      &lt;p style="margin: 0px"&gt;        &lt;span style="color: blue"&gt;this&lt;/span&gt;._id = automaticIDs[index];&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    }&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    &lt;span style="color: blue"&gt;else&lt;/span&gt;&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    {&lt;/p&gt;      &lt;p style="margin: 0px"&gt;        &lt;span style="color: blue"&gt;this&lt;/span&gt;._id = &lt;span style="color: #a31515"&gt;"ctl"&lt;/span&gt; + index.ToString(NumberFormatInfo.InvariantInfo);&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    }&lt;/p&gt;      &lt;p style="margin: 0px"&gt;    &lt;span style="color: blue"&gt;this&lt;/span&gt;._namingContainer.DirtyNameTable();&lt;/p&gt;      &lt;p style="margin: 0px"&gt;}&lt;/p&gt;   &lt;/div&gt; &lt;/div&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p&gt;As you can see, this method simply looks at the specified array of control names for the next ’ctlXXX’ value until it runs out then it generates one. The ctlXXX ‘counter’ restarts for each NamingContainer…so it’s pretty unlikely you’ll get to the end of the static array of control names. The ‘automaticIDs’ array is used simply as a performance optimization…saving even this very simple piece of code from running on each control rendering.&lt;/p&gt;  &lt;h2&gt;So What’s With the Control’s ‘Name’ &lt;/h2&gt;  &lt;p&gt;In the examples in the previous section you can see that there’s not just an Id attribute, rather there’s also a ‘name’ attribute for each control, e.g., “rootPanel$childPanel1$TextBox". You’ll see that this looks really similar to the Id property (and is in fact generated using almost an identical code-path), so why are there two different attributes. In the simplest explanation, consider the ‘name’ attribute to be the ‘server side’ name and the ‘id’ attribute to be the client side one.    &lt;br /&gt;When you “post’ or ‘get’ a form in HTML the ‘name’ attribute links the specific HTML control to the value which gets posted back; this is where the ‘uniqueness’ part comes in. By being unique it’s possible to hook up the posted value back to the Control on the server, in addition this also specifies the correct event to call on postback.     &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; While in current ASP.NET, it’s possible to translate from the name attribute to the id attribute this is not guaranteed  and will most likely break when using the new ASP.NET 4.0 functionality. We will not alter the ‘name’ attribute in ASP.NET 4.0…&lt;/p&gt;  &lt;h2&gt;Client Ids in DataBound Controls&lt;/h2&gt;  &lt;p&gt;The most critical reason for ensuring rendered controls have unique id attributes is controls within Data Bound controls. As an example the following markup defines a simple ListView hooked up to the Northwind database:&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;tc:NamingPanel runat="server" id="rootPanel"&amp;gt;    &lt;br /&gt;      &amp;lt;tc:NamingPanel runat="server"&amp;gt;         &lt;/p&gt;  &lt;p&gt;          &amp;lt;asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="&amp;lt;%$ ConnectionStrings:ConnectionString %&amp;gt;"    &lt;br /&gt;              SelectCommand="SELECT [ProductName] FROM [Alphabetical list of products]"&amp;gt;&amp;lt;/asp:SqlDataSource&amp;gt;     &lt;br /&gt;          &amp;lt;asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1"     &lt;br /&gt;              onselectedindexchanged="ListView1_SelectedIndexChanged"&amp;gt;     &lt;br /&gt;              &amp;lt;ItemTemplate&amp;gt;     &lt;br /&gt;                  &amp;lt;tr style=""&amp;gt;     &lt;br /&gt;                      &amp;lt;td&amp;gt;     &lt;br /&gt;                          &amp;lt;asp:Label ID="ProductNameLabel" runat="server"     &lt;br /&gt;                              Text='&amp;lt;%# Eval("ProductName") %&amp;gt;' /&amp;gt;     &lt;br /&gt;                      &amp;lt;/td&amp;gt;     &lt;br /&gt;                  &amp;lt;/tr&amp;gt;     &lt;br /&gt;              &amp;lt;/ItemTemplate&amp;gt;     &lt;br /&gt;                  &amp;lt;LayoutTemplate&amp;gt;     &lt;br /&gt;                  &amp;lt;table runat="server"&amp;gt;     &lt;br /&gt;                      &amp;lt;tr runat="server"&amp;gt;     &lt;br /&gt;                          &amp;lt;td runat="server"&amp;gt;     &lt;br /&gt;                              &amp;lt;table ID="itemPlaceholderContainer" runat="server" border="0" style=""&amp;gt;     &lt;br /&gt;                                  &amp;lt;tr runat="server" style=""&amp;gt;     &lt;br /&gt;                                      &amp;lt;th runat="server"&amp;gt;     &lt;br /&gt;                                          ProductName&amp;lt;/th&amp;gt;     &lt;br /&gt;                                  &amp;lt;/tr&amp;gt;     &lt;br /&gt;                                  &amp;lt;tr ID="itemPlaceholder" runat="server"&amp;gt;     &lt;br /&gt;                                  &amp;lt;/tr&amp;gt;     &lt;br /&gt;                              &amp;lt;/table&amp;gt;     &lt;br /&gt;                          &amp;lt;/td&amp;gt;     &lt;br /&gt;                      &amp;lt;/tr&amp;gt;     &lt;br /&gt;                      &amp;lt;tr runat="server"&amp;gt;     &lt;br /&gt;                          &amp;lt;td runat="server" style=""&amp;gt;     &lt;br /&gt;                          &amp;lt;/td&amp;gt;     &lt;br /&gt;                      &amp;lt;/tr&amp;gt;     &lt;br /&gt;                  &amp;lt;/table&amp;gt;     &lt;br /&gt;              &amp;lt;/LayoutTemplate&amp;gt;     &lt;br /&gt;          &amp;lt;/asp:ListView&amp;gt;     &lt;br /&gt;      &amp;lt;/tc:NamingPanel&amp;gt;     &lt;br /&gt;  &amp;lt;/tc:NamingPanel&amp;gt;&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;The markup above has the ListView inside the NamingPanels we had previously. This markup generates the following HTML (or a sinppet of it…)&lt;/p&gt;  &lt;p&gt;    &amp;lt;table&amp;gt;    &lt;br /&gt;            &amp;lt;tr&amp;gt;     &lt;br /&gt;                &amp;lt;td&amp;gt;     &lt;br /&gt;                                &amp;lt;table id="rootPanel_ctl00_ListView1_itemPlaceholderContainer" border="0" style=""&amp;gt;     &lt;br /&gt;                    &amp;lt;tr style=""&amp;gt;     &lt;br /&gt;                        &amp;lt;th&amp;gt; ProductName&amp;lt;/th&amp;gt;     &lt;br /&gt;                    &amp;lt;/tr&amp;gt;     &lt;br /&gt;                    &amp;lt;tr style=""&amp;gt;     &lt;br /&gt;                        &amp;lt;td&amp;gt;     &lt;br /&gt;                            &amp;lt;span id="rootPanel_ctl00_ListView1_ctrl0_ProductNameLabel"&amp;gt;Chai&amp;lt;/span&amp;gt;     &lt;br /&gt;                        &amp;lt;/td&amp;gt;     &lt;br /&gt;                    &amp;lt;/tr&amp;gt; &lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;As you can see, the controls in the ListView are rendered using a mix of user-defined as well as auto-generated ids…this is great for ensuring the names are unique but pretty useless if you need to know the ids of the controls at render time…As an example it’s really difficult to ensure that client side code such as Javascript can easily identify a specific control within the page without mixing in the classic &amp;lt;%=Control.ClientId%&amp;gt; server side markup into the JS.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; Databound controls are more difficult than usual when trying to ensure unique control Ids you only have access to some of the container controls at design-time (e.g., ctrl0 in the above html is not accessible in the designer…so you can’t change the id without hooking into backend events).&lt;/p&gt;  &lt;h2&gt;More Control over Control Ids…ASP.NET 4.0 Client Ids&lt;/h2&gt;  &lt;p&gt;So, what are we doing in ASP.NET 4.0 to let you define the ids? &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NOTE: The information below is different to the Visual Studio 10 PDC CTP VPC (love those acronyms!). Following the CTP release we refactored to remove the ‘set’ on the ClientId property…this is to improve the behavior of the API, previously the value you got back from ClientId would almost certainly not match the value you set. In the new API you set the Id parameter and can then ‘get’ the ClientId property…&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;IMPORTANT: The new Client Id functionality has no impact on the server side name of the control, so string myString = TextBox1.Text; is completely unaffected by the Client Id changing.&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;In order to enable you to have more control over Client Ids we added a of property on ‘System.Web.UI.Control’:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ClientIdMode&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Legacy – &lt;/strong&gt;This is exactly equivalent to the ASP.NET 2.0 Client Id behavior. This is also the default if no &lt;em&gt;ClientIdMode&lt;/em&gt; property is set in the current control’s hierarchy. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Static&lt;/strong&gt; – You set it, you get it…most controllable but potentially the least ‘safe’. If a control is set to ‘static’ &lt;em&gt;ClientIdMode&lt;/em&gt; then exactly what you set for Id is used as the client id, no matter what naming container the control sits in. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Predictable&lt;/strong&gt; – Mostly for use in DataBound controls, only uses ‘set’ Id attributes of parent Naming Containers (so, no automatic id generation using ‘ctlXXX’ names). This also works in conjunction with the DataBound control property &lt;em&gt;RowClientIdSuffix&lt;/em&gt; to allow you to define the ‘uniquefying’ item for the specific row. Previously, the auto-generated name ctrl0…ctrl1…ctrl2…etc…was used to provide this uniqueifying function for controls in the rows of DataBound controls. &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Inherit&lt;/strong&gt; -  Essentially the ‘default’ behavior for controls, explicitly setting &lt;em&gt;ClientIdMode = ‘Inherit’ &lt;/em&gt;essentially clears the &lt;em&gt;ClientIdMode&lt;/em&gt; for the current control and allows this and any child controls (which have either ‘Inherit’ as &lt;em&gt;ClientIdMode&lt;/em&gt; or &lt;em&gt;ClientIdMode&lt;/em&gt; not set) will take the &lt;em&gt;ClientIdMode&lt;/em&gt; of any parent control (including Page and Config…see below) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Page&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You can also set the &lt;em&gt;ClientIdMode&lt;/em&gt; at Page level, this defines the default &lt;em&gt;ClientIdMode&lt;/em&gt; for all controls within the current page…&lt;/p&gt;  &lt;p&gt;&amp;lt;%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" ClientIdMode="Static"%&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Config&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;It’s also possible to set the &lt;em&gt;ClientIdMode&lt;/em&gt; in the config section at either machine or application level…this defines the default &lt;em&gt;ClientIdMode&lt;/em&gt; for all controls within all pages in the application.&lt;/p&gt;  &lt;p&gt;&amp;lt;system.web&amp;gt;    &lt;br /&gt;  &amp;lt;pages clientIdMode="Predictable"&amp;gt;&amp;lt;/pages&amp;gt;     &lt;br /&gt;&amp;lt;/system.web&amp;gt;&lt;/p&gt;  &lt;h3 /&gt;  &lt;h3&gt;So what can I do with that?&lt;/h3&gt;  &lt;h4&gt;Restarting Control Naming&lt;/h4&gt;  &lt;p&gt;As mentioned earlier the client id for a control is derived from the NamingContainers in which the control sits in the Control Hierarchy, normally this is only the actual controls within the page (e.g., in DataBound controls), however when using MasterPages you can end up with ids as found in the following HTML:&lt;/p&gt;  &lt;p&gt;    &amp;lt;div id="ctl00_ContentPlaceHolder1_ParentPanel"&amp;gt;    &lt;br /&gt;        &amp;lt;div id="ctl00_ContentPlaceHolder1_ParentPanel_NamingPanel1"&amp;gt;     &lt;br /&gt;            &amp;lt;input name="ctl00$ContentPlaceHolder1$ParentPanel$NamingPanel1$TextBox1" type="text" value="Hello!" id="ctl00_ContentPlaceHolder1_ParentPanel_NamingPanel1_TextBox1" /&amp;gt;     &lt;br /&gt;    &amp;lt;/div&amp;gt; &lt;/p&gt;  &lt;p&gt;Even though the TextBox shown in the HTML is only within two NamingContainers within the page, due to the way MasterPages hook together you wind up with a control id like the following: ctl00_ContentPlaceHolder1_ParentPanel_NamingPanel1_TextBox1&lt;/p&gt;  &lt;p&gt;Obviously this is a pretty long id…guaranteed unique within the page but unnecessarily long for most purposed. In this example we now want to reduce the length of the rendered id and make it more user defined (so, shortened, no ctlXXX etc…). The easiest way to achieve this is the following&lt;/p&gt;  &lt;p&gt;&amp;lt;tc:NamingPanel runat="server" ID="ParentPanel" &lt;strong&gt;ClientIdMode="Static"&lt;/strong&gt;&amp;gt;     &lt;br /&gt;    &amp;lt;tc:NamingPanel runat="server" ID="NamingPanel1" ClientIdMode=”Predictable"&amp;gt;     &lt;br /&gt;        &amp;lt;asp:TextBox ID="TextBox1" runat="server" Text="Hello!"&amp;gt;&amp;lt;/asp:TextBox&amp;gt;     &lt;br /&gt;    &amp;lt;/tc:NamingPanel&amp;gt;     &lt;br /&gt;&amp;lt;/tc:NamingPanel&amp;gt;&lt;/p&gt;  &lt;p&gt;In this sample (identical to earlier markup) we’ve set the &lt;em&gt;ClientIdMode&lt;/em&gt; to ‘Static’ on the outermost &lt;em&gt;NamingPanel&lt;/em&gt; as well as setting the next ‘Child’ control to ‘Predictable’. This results in this markup (note, the rest of the page, MasterPages etc,…is identical to the previous example)&lt;/p&gt;         &amp;lt;div id="ParentPanel"&amp;gt;   &lt;br /&gt;        &amp;lt;div id="ParentPanel_NamingPanel1"&amp;gt;   &lt;br /&gt;            &amp;lt;input name="ctl00$ContentPlaceHolder1$ParentPanel$NamingPanel1$TextBox1" type="text" value="Hello!" id="ParentPanel_NamingPanel1_TextBox1" /&amp;gt;   &lt;br /&gt;    &amp;lt;/div&amp;gt;   &lt;p&gt;Here we’ve essentially restarted the naming hierarchy for Controls to the outermost &lt;em&gt;NamingPanel&lt;/em&gt; , eliminating the ContentPlaceHolder and MasterPage names from the id (note: the ‘name’ attribute is unaffected…meaning we retain the normal ASP.NET functionality for events, ViewState etc…). A nice side-effect of restarting the naming hierarchy is that even if the markup defining the &lt;em&gt;NamingPanels&lt;/em&gt;  is moved to a different ContentPlaceholder, the rendered Client Ids remain the same. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; The developer does now take more responsibility for ensuring that rendered Control Ids are unique…not doing so can break functionality which expect to find unique HTML elements for each Id (e.g., Javascript’s GetElementById()).&lt;/p&gt;  &lt;h4&gt;Predictable DataBound Client Ids&lt;/h4&gt;  &lt;p&gt;As we showed previously, the Client Ids  generated for Controls within DataBound list controls are pretty messy and not really predictable…How does the new Client Id functionality help?&lt;/p&gt;  &lt;p&gt;We want to achieve the following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Shorten the Client Ids for Controls &lt;/li&gt;    &lt;li&gt;Make the Client Id predictable &lt;/li&gt;    &lt;li&gt;Make the Client Id unique across pages (rather than ‘within’ pages) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;So, how do we do this?&lt;/p&gt;  &lt;p&gt;&amp;lt;tc:NamingPanel runat="server" id="rootPanel"&amp;gt;    &lt;br /&gt;      &amp;lt;tc:NamingPanel runat="server"&amp;gt;         &lt;/p&gt;  &lt;p&gt;          &amp;lt;asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="&amp;lt;%$ ConnectionStrings:ConnectionString %&amp;gt;"    &lt;br /&gt;              SelectCommand="SELECT [ProductName], [ProductID] FROM [Alphabetical list of products]"&amp;gt;&amp;lt;/asp:SqlDataSource&amp;gt;     &lt;br /&gt;          &amp;lt;asp:ListView ID="ListView1" runat="server" DataSourceID="SqlDataSource1"     &lt;br /&gt;              onselectedindexchanged="ListView1_SelectedIndexChanged" &lt;strong&gt;ClientIdMode=”Predictable” RowClientIdSuffix=”ProductID”&amp;gt;&lt;/strong&gt;     &lt;br /&gt;              &amp;lt;ItemTemplate&amp;gt;     &lt;br /&gt;                  &amp;lt;tr style=""&amp;gt;     &lt;br /&gt;                      &amp;lt;td&amp;gt;     &lt;br /&gt;                          &amp;lt;asp:Label ID="ProductNameLabel" runat="server"     &lt;br /&gt;                              Text='&amp;lt;%# Eval("ProductName") %&amp;gt;' /&amp;gt;     &lt;br /&gt;                      &amp;lt;/td&amp;gt;     &lt;br /&gt;                  &amp;lt;/tr&amp;gt;     &lt;br /&gt;              &amp;lt;/ItemTemplate&amp;gt;     &lt;br /&gt;                  &amp;lt;LayoutTemplate&amp;gt;     &lt;br /&gt;                  &amp;lt;table runat="server"&amp;gt;     &lt;br /&gt;                      &amp;lt;tr runat="server"&amp;gt;     &lt;br /&gt;                          &amp;lt;td runat="server"&amp;gt;     &lt;br /&gt;                              &amp;lt;table ID="itemPlaceholderContainer" runat="server" border="0" style=""&amp;gt;     &lt;br /&gt;                                  &amp;lt;tr runat="server" style=""&amp;gt;     &lt;br /&gt;                                      &amp;lt;th runat="server"&amp;gt;     &lt;br /&gt;                                          ProductName&amp;lt;/th&amp;gt;     &lt;br /&gt;                                  &amp;lt;/tr&amp;gt;     &lt;br /&gt;                                  &amp;lt;tr ID="itemPlaceholder" runat="server"&amp;gt;     &lt;br /&gt;                                  &amp;lt;/tr&amp;gt;     &lt;br /&gt;                              &amp;lt;/table&amp;gt;     &lt;br /&gt;                          &amp;lt;/td&amp;gt;     &lt;br /&gt;                      &amp;lt;/tr&amp;gt;     &lt;br /&gt;                      &amp;lt;tr runat="server"&amp;gt;     &lt;br /&gt;                          &amp;lt;td runat="server" style=""&amp;gt;     &lt;br /&gt;                          &amp;lt;/td&amp;gt;     &lt;br /&gt;                      &amp;lt;/tr&amp;gt;     &lt;br /&gt;                  &amp;lt;/table&amp;gt;     &lt;br /&gt;              &amp;lt;/LayoutTemplate&amp;gt;     &lt;br /&gt;          &amp;lt;/asp:ListView&amp;gt;     &lt;br /&gt;      &amp;lt;/tc:NamingPanel&amp;gt;     &lt;br /&gt;  &amp;lt;/tc:NamingPanel&amp;gt;&lt;/p&gt;  &lt;p&gt;In the markup above, we have used the &lt;em&gt;ClientIdMode&lt;/em&gt; and &lt;em&gt;RowClientIdSuffix&lt;/em&gt; properties. &lt;em&gt;RowClientIdSuffix&lt;/em&gt; is a property which can only be used in DataBound controls and actually differs based on the DataBound control it’s used with:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;GridView:&lt;/strong&gt; You can specify the name of a column in the DataSource &lt;u&gt;or &lt;/u&gt;multiple columns which are then combined at runtime. As an example if you specified &lt;em&gt;RowClientIdSuffix &lt;/em&gt;as “ProductName, ProductId” in a &lt;em&gt;GridView&lt;/em&gt;  then the rendered control Id would be "rootPanel_GridView1_ProductNameLabel_Chai_1”.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ListView:&lt;/strong&gt; You can specify a single column in the DataSource which will be appended to the Client Id. As an example if you specified &lt;em&gt;RowClientIdSuffix &lt;/em&gt;as “ProductName” in a &lt;em&gt;ListView&lt;/em&gt;then the rendered control Id would be "rootPanel_ListView1_ProductNameLabel_1”. In this case the last ‘1’ comes from the ProductId of the DataItem.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Repeater:&lt;/strong&gt; No RowClientIdSuffix property is allowed. In a Repeater the index of the Row is used. In the case above, you would wind up with "rootPanel_Repeater1_ProductNameLabel_0”. The ‘0’ is simply the index of the current row.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;em&gt;FormView&lt;/em&gt;, &lt;em&gt;DetailsView&lt;/em&gt; do not have multiple rows so do not have a RowClientIdSuffix property.&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h2&gt;Conclusion&lt;/h2&gt;  &lt;p&gt;So, there you have it…I dare say I’ll post again in future about this topic, we have a sample app which will find it’s way onto &lt;a href="http://www.codeplex.com/aspnet"&gt;Codeplex&lt;/a&gt; in the near future!&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; In current CTP builds you cannot use &lt;em&gt;UpdatePanel&lt;/em&gt;s with controls when you use the new Client Id functionality. This is fixed internally and will work correctly in future public releases.&lt;/font&gt;&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1303.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=L6DVN"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=L6DVN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=MDQJn"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=MDQJn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=1GYBN"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=1GYBN" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=5HWIn"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=5HWIn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=wmmcN"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=wmmcN" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/441426174" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/11/03/way-too-much-information-on-control-ids-and-asp.net-4.0.aspx</guid>
            <pubDate>Mon, 03 Nov 2008 21:41:30 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1303.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/11/03/way-too-much-information-on-control-ids-and-asp.net-4.0.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1303.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1303.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F11%2F03%2Fway-too-much-information-on-control-ids-and-asp.net-4.0.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/11/03/way-too-much-information-on-control-ids-and-asp.net-4.0.aspx</feedburner:origLink></item>
        <item>
            <title>All about me...</title>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/402397163/all-about-me.aspx</link>
            <description>&lt;p&gt;Reading &lt;a href="http://www.haacked.com/archive/2007/01/02/Five_Things_You_Didnt_Want_To_Know_About_Me.aspx"&gt;Phil&lt;/a&gt; and &lt;a href="http://www.hanselman.com/blog/FiveThingsYouSeriouslyDidntKnowAboutMe.aspx"&gt;ScottHa's&lt;/a&gt; 'Five things you didn't know about me' posts and started one of my own...but I only got to number two before I realized that the rest are either very illegal / potentially career ending so I stopped. Anyway I haven't posted here for a while and I wanted to give my reader an update on what's happenin' wit me...&lt;/p&gt; &lt;p&gt;Features...the name MS gives to 'stuff that's in the product', working away on some WebForms stuff. Some stuff has already made it to &lt;a href="http://channel9.msdn.com/pdc2008/PC20/"&gt;the world&lt;/a&gt;. I've worked on the ability to specify your own Ids for controls (client side) and currently looking at some Routing stuff, improving how our controls render their content as well as a hodge-podge of other stuff for ASP.NET 4.0.  In general I 'own' WebForms so all of my work revolves around improving the experience using this stuff.&lt;/p&gt; &lt;p&gt;Releases...if there's one thing the ASP.NET team does really well it's generate 'stuff', one of my responsibilities is how / where / when we release this 'stuff'; as an example we just released work from the &lt;a href="http://weblogs.asp.net/asptest"&gt;ASP.NET QA&lt;/a&gt; team as well as &lt;a href="http://www.codeplex.com/aspnet/Wiki/View.aspx?title=Dynamic%20Language%20Support&amp;amp;referringTitle=Home"&gt;'Dynamic Language Support'&lt;/a&gt; updates. Doing this takes a lot of work for everyone involved, from the teams actually doing the work to my little part at the end where I make sure we're good to release stuff (legal, honest, useful) / do the physical release. &lt;/p&gt; &lt;p&gt;Process...probably my least favorite bit of my job, but a necessary one. All sorts of not very interesting stuff around navigating the bullshit that comes with working in a big company right through to dealing with incoming bugs / making sure dev's fixing them, PMs are making judgement calls and QA is testing the fixes. No-one likes doing it but my job's to buffer the team from all of the crap which inevitably goes along with what we do.&lt;/p&gt; &lt;p&gt;Community...one of my favorite bits of my job, working with groups like the &lt;a href="http://www.aspinsiders.com/"&gt;ASP Insiders&lt;/a&gt;, events and generally looking after how the product team interacts with this stuff (and making sure we don't forget it!). Sounds easy but my (*heavily filtered) inbox gets &amp;gt;300 mails a day, about 10% of which are bang (&lt;font color="#ff0000"&gt;!&lt;font color="#000000"&gt;) mails...one of the hardest skills as a PM in MS is just managing your mail / keeping up with all the threads going on at any particular moment. &lt;/font&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Personal life...pretty much dead. I made the decision after breaking up with my last girlfriend in March to take a year off and get things straight...5 years of continuous dating with a mean relationship length of ~2 months wasn't healthy. &lt;br /&gt;&lt;/p&gt; &lt;p&gt;So that's me...I'm a bit 'behind the scenes' on the team at the moment (well, compared to superstars like &lt;a href="http://www.haacked.com"&gt;Haacked&lt;/a&gt;) but hey, I'm happy getting things done. I'll start speaking at conferences in the next few months...especially as my features will start getting more attention.&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1302.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=6ycTL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=6ycTL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=G6bXl"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=G6bXl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=QgsZL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=QgsZL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=lEREl"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=lEREl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=H99XL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=H99XL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/402397163" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/09/24/all-about-me.aspx</guid>
            <pubDate>Thu, 25 Sep 2008 02:57:52 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1302.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/09/24/all-about-me.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1302.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1302.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F09%2F24%2Fall-about-me.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/09/24/all-about-me.aspx</feedburner:origLink></item>
        <item>
            <title>Mix tape!</title>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/391269200/mix-tape.aspx</link>
            <description>&lt;div style="text-align: center; width: 430px"&gt;&lt;embed height="327" type="application/x-shockwave-flash" width="426" src="http://www.mixwit.com/flash/widgets/shell.swf" flashvars="env=embed&amp;amp;widget=400d1ab4efe4a93f84bc231ea290840c&amp;amp;playlist=92e93e8ea1304f6941835a5875324a9a&amp;amp;vuid=embed" wmode="transparent" /&gt; &lt;script src="http://www.mixwit.com/m.js"&gt;&lt;/script&gt;  &lt;a href="http://www.mixwit.com/scott1?e"&gt;&lt;img style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" border="0" alt="Mixwit" src="http://www.mixwit.com/p.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.mixwit.com/create?e"&gt;&lt;img style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" border="0" alt="Mixwit make a mixtape" src="http://www.mixwit.com/m.jpg" /&gt;&lt;/a&gt;&lt;a href="http://www.mixwit.com/?e"&gt;&lt;img style="padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px" border="0" alt="Mixwit mixtapes" src="http://www.mixwit.com/l.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;img style="width: 0px; height: 0px; visibility: hidden" border="0" src="http://counters.gigya.com/wildfire/IMP/CXNID=2000002.0NXC/bT*xJmx*PTEyMjEyNzk*MzEzMDQmcHQ9MTIyMTI3OTQ5MDA4NiZwPTE4NDMzMSZkPSZuPSZnPTEmdD*mbz**NTI1Yzg4MzM*OWY*YzBlOTYyMTg1MjkzMzlmYjk1NA==.gif" width="0" height="0" /&gt;&lt;img src="http://mostlylucid.net/aggbug/1301.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=5KXmL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=5KXmL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=3Hrjl"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=3Hrjl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=S6hFL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=S6hFL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=A0k3l"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=A0k3l" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=oBQ1L"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=oBQ1L" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/391269200" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/09/12/mix-tape.aspx</guid>
            <pubDate>Sat, 13 Sep 2008 04:18:30 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1301.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/09/12/mix-tape.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1301.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1301.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F09%2F12%2Fmix-tape.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/09/12/mix-tape.aspx</feedburner:origLink></item>
        <item>
            <title>ViewState does not suck...part 1</title>
            <category>ASP.NET</category>
            <category>ASP.NET Tips</category>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/387936485/viewstate-does-not-suck.part-1.aspx</link>
            <description>&lt;p&gt;I was trawling through new posts on the &lt;a href="http://weblogs.asp.net"&gt;ASP.NET blog site&lt;/a&gt; and came across &lt;a href="http://blogs.msdn.com/tess/archive/2008/09/09/asp-net-memory-identifying-pages-with-high-viewstate.aspx"&gt;this one&lt;/a&gt; from &lt;a href="http://blogs.msdn.com/tess"&gt;Tess&lt;/a&gt; (who is someone I should probably know but don’t…). What I found interesting (as well as the post which is excellent) was the first comment:&lt;/p&gt;  &lt;p&gt;  “&lt;em&gt;When will MS simply drop the Viewstate completely?    This is a good example of a solution to a problem that shouldn't be a problem to begin with.&lt;/em&gt; “&lt;/p&gt;  &lt;p&gt;This got me to thinking, ViewState has gotten a &lt;a href="http://www.google.com/search?rlz=1C1GGLS_enUS291&amp;amp;sourceid=chrome&amp;amp;ie=UTF-8&amp;amp;q=viewstate+sucks"&gt;really bad rap&lt;/a&gt; &lt;a href="http://staff.interesource.com/james/aug06/viewstate_postbacks_harmful.htm"&gt;over the years&lt;/a&gt; (with &lt;a href="http://www.hanselman.com/blog/PermaLink.aspx?guid=f96141db-a1db-42b0-b87b-823e91d18352"&gt;notable exceptions&lt;/a&gt;). Let’s look at what ViewState actually is and why it might not be the villan it’s often painted out to be…&lt;/p&gt;  &lt;p&gt;What is ViewState…at it’s simplest it’s a hidden field which contains data about the controls currently on the page. Really, that’s it…now it does this pretty cleverly, serializing a whole bunch of stuff into a Base64 encoded string (which can also be encrypted, validated etc…). &lt;/p&gt;  &lt;p&gt;For those of us who wrote web apps back in the dark ages i.e., before ASP.NET, we remember the days where we had a bunch of hidden fields used to track changes in a page, and it was frankly a pain in the ass…it was far more transparent but a lot of grunt work just to track if a field’s value had changed / store some additional data in the page for use in postback. ViewState solves that problem pretty nicely actually.&lt;/p&gt;  &lt;p&gt;So, what’s the problem people have? Two things:&lt;/p&gt;  &lt;p&gt;1. people misuse it; it’s partly our fault and partly theirs.&lt;/p&gt;  &lt;p&gt;From &lt;a href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/Truly-Understanding-Viewstate.aspx"&gt;‘Truly Understanding Viewstate’&lt;/a&gt;:    &lt;br /&gt;    &lt;br /&gt;&lt;strong&gt;&lt;em&gt;CASES OF MISUSE&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;a. Forcing a Default      &lt;br /&gt;b. Persisting static data       &lt;br /&gt;c. Persisting cheap data       &lt;br /&gt;d. Initializing child controls programmatically       &lt;br /&gt;e. Initializing dynamically created controls programmatically&lt;/em&gt;&lt;/p&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p&gt;Now, as I said it’s not entirely their fault…ViewState is enabled by default…if you bind a bunch of data to a DataBound Control then you’ll get a huge amount of ViewState serialized to and from the browser each time, it’s not that easy to figure out what having no ViewState will break / just enable it for certain controls and not others (which is what &lt;a href="http://haacked.com/archive/2007/03/16/gain-control-of-your-control-state.aspx"&gt;ControlState&lt;/a&gt; lets you do…just not for existing controls).    &lt;br /&gt;At it’s core the problem ViewState really has is that it’s a &lt;a href="http://www.joelonsoftware.com/articles/LeakyAbstractions.html"&gt;Leaky Abstraction&lt;/a&gt;; it’s ALMOST there but doesn’t quite hit the sweet spot nowadays…&lt;/p&gt;  &lt;p&gt;So, how do you use ViewState correctly…what can you do to avoid the pitfalls? &lt;/p&gt;  &lt;p&gt;Stay tuned!&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1300.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=351lL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=351lL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=Tym4l"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=Tym4l" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=qDmtL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=qDmtL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=CxPUl"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=CxPUl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=YXeqL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=YXeqL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/387936485" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/09/09/viewstate-does-not-suck.part-1.aspx</guid>
            <pubDate>Tue, 09 Sep 2008 19:24:50 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1300.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/09/09/viewstate-does-not-suck.part-1.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1300.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1300.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F09%2F09%2Fviewstate-does-not-suck.part-1.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/09/09/viewstate-does-not-suck.part-1.aspx</feedburner:origLink></item>
        <item>
            <title>John Lam&amp;rsquo;s Dev Kit</title>
            <category>.NET</category>
            <category>Random</category>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/387075329/john-lamrsquos-dev-kit.aspx</link>
            <description>&lt;p /&gt;  &lt;p /&gt;  &lt;p&gt;Kind of a &lt;a href="http://www.hanselman.com/tools"&gt;‘tools’ list&lt;/a&gt; but a great post on what &lt;a href="http://www.iunknown.com/2008/08/my-dev-kit.html"&gt;John uses on his machine&lt;/a&gt;…a few new ones I hadn’t seen which is always nice!&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1299.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=45YYL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=45YYL" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=3vh1l"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=3vh1l" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=YmJ0L"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=YmJ0L" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=hQ2Pl"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=hQ2Pl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=1tmbL"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=1tmbL" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/387075329" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/09/08/john-lamrsquos-dev-kit.aspx</guid>
            <pubDate>Mon, 08 Sep 2008 22:35:43 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1299.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/09/08/john-lamrsquos-dev-kit.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1299.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1299.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F09%2F08%2Fjohn-lamrsquos-dev-kit.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/09/08/john-lamrsquos-dev-kit.aspx</feedburner:origLink></item>
        <item>
            <title>Know Issues / Breaking changes in ASP.NET 3.5 SP1</title>
            <category>ASP.NET</category>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/365251108/know-issues--breaking-changes-in-asp.net-3.5-sp1.aspx</link>
            <description>&lt;p&gt;&lt;font color="#ff0000"&gt;UPDATE 08/27: Found a couple of more changes&lt;/font&gt; &lt;/p&gt;  &lt;p&gt;We’re using this &lt;a href="http://forums.asp.net/t/1305800.aspx"&gt;forum post&lt;/a&gt; to track our Breaking Changes / Known issues in the SP1 release. Initial text is below but please feel free to link to this forum post from any blogs etc...to track these changes. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;I'll also keep this blog post updated with any changes...&lt;/strong&gt; &lt;/p&gt;  &lt;p&gt;With the release of ASP.NET in .NET 3.5 Service Pack 1 some breaking changes have been introduced. This post will be used to list those changes and any workarounds / fixes for these issues.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Issue:  Dynamic Data fails on Entity Framework data models that contain 1-&amp;gt;0..1 and *-&amp;gt;1 database relations     &lt;br /&gt;Reason:&lt;/strong&gt;    &lt;br /&gt;Dynamic Data fails on Entity Framework data models that contain 1-&amp;gt;0..1 and *-&amp;gt;1 database relations with an error like "'System.Web.UI.WebControls.EntityDataSourceWrapper' does not contain a property with the name 'Orders.OrderID'". These types of relationships occur in many databases including Northwind and AdventureWorks. The error is caused by a naming mismatch that Dynamic Data has with the wrapper objects being returned by the EntityDataSource.    &lt;br /&gt;&lt;strong&gt;Workaround:     &lt;br /&gt;&lt;/strong&gt;We have a temporary fix available at: &lt;a href="http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16367"&gt;http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16367&lt;/a&gt; which replaces the data model provider with one that names the properties correctly.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Issue: After installing .NET 3.5 SP1, a web site using a derived version of the UpdateProgress control may encounter the following exception: “A ProgressTemplate must be specified on UpdateProgress control with ID ‘id’.”&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Reason:&lt;/strong&gt;    &lt;br /&gt; In the .NET Framework 3.5, the UpdateProgress control enforced the requirement of a ProgressTemplate from it’s PreRender routine. A derived UpdateProgress control could subvert that requirement by overriding OnPreRender in the derived control, and avoiding calling base.OnPreRender. In the .NET Framework 3.5 SP1, the UpdateProgress control now uses CreateChildControls to instantiate the ProgressTemplate, causing the requirement to be enforced at a different point in the page life cycle, and preventing the OnPreRender technique from subverting the check. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Issue: Hidden files/folders inside App_Browsers are not ignored     &lt;br /&gt;Reason:      &lt;br /&gt;&lt;/strong&gt;3.5SP1 does not “honor” the fact that _vti_cnf is Hidden… and it still tries to read it and parse the file inside that folder.. which results in this error.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Workaround:&lt;/strong&gt;    &lt;br /&gt;At the moment the workaround is to simply delete _vti_cnf folder however we are still investigating a fix for this issue.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Issue:  The HtmlForm action attribute is now honored when defined in declarative markup.&lt;/strong&gt;    &lt;br /&gt;&lt;strong&gt;Reason:     &lt;br /&gt;&lt;/strong&gt;3.5 SP1 added a settable Action property to the HtmlForm type.  This new feature makes it much easier for developers to explicitly set the form’s action attribute for scenarios where a developer wants to use a different Url than the normal postback-generated Url.  However this change also means that if the action attribute has been set in an .aspx page’s declarative markup, ASP.NET will use the setting from the markup when rendering a &amp;lt;form /&amp;gt; element.  &lt;br /&gt;&lt;strong&gt;Workaround:     &lt;br /&gt;&lt;/strong&gt;Previous versions of ASP.NET always ignored the action attribute if it was present in the declarative markup for a &amp;lt;form /&amp;gt; element.  Developers should remove the action attribute from their declarative markup to return to the original behavior where ASP.NET renders the postback Url.    &lt;br /&gt;&lt;strong&gt;Example:     &lt;br /&gt;&lt;/strong&gt;Before (the action attribute was ignored by ASP.NET as dead code):  &amp;lt;form name="form1" method="post" runat="server" action="test.aspx"&amp;gt;&amp;lt;/form&amp;gt;     &lt;br /&gt;3.5 SP1 (remove the action attribute to have ASP.NET render the postback Url):  &amp;lt;form name="form1" method="post" runat="server" &amp;gt;&amp;lt;/form&amp;gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Issue: After installing .NET 3.5 SP1, a web site using pageBaseType now encounters the following compilation error: “Make sure that the class defined in this code file matches the 'inherits' attribute.”&lt;/strong&gt;    &lt;br /&gt;&lt;strong&gt;Reason:     &lt;br /&gt;&lt;/strong&gt;The behavior you are seeing is the original behavior of ASP.NET 2.0. When the .NET Framework 3.5 and Visual Studio 2008 were introduced, a bug was introduced that affected certain pageBaseType scenarios that unfortunately were not intended. It seems as if you might have run into one of these scenarios. In the .NET Framework 3.5 SP1, the bug was fixed and these scenarios no longer occur; pageBaseType again works the same as in ASP.NET 2.0, as requested by customers. Unfortunately, this means that customers who have relied on the unintended behavior that was introduced in the .NET Framework 3.5 will now encounter problems when they run their applications.&lt;/p&gt;  &lt;p&gt;We are now evaluating creating a HotFix for these scenarios and providing workarounds for customers to help with this issue.  &lt;/p&gt;  &lt;p&gt;Here are some details about the issue; we  will post a more detailed description soon. The mismatch is caused by the class in the code file not being assignable to the pageBaseType that is defined in the web.config file. The sequence that occurs is this:&lt;/p&gt;  &lt;p&gt;- During code generation for a page (MyPage.aspx) in a Web site, ASP.NET creates a separate class from the class that is defined in the code-behind file source (MyPage.aspx.cs). The web.config file’s pageBaseType value can be used in cases where you want all pages to have certain properties. It applies to all pages, not just to pages that do not have code-behind files.&lt;/p&gt;  &lt;p&gt;- If MyPage.aspx has a CodeFile attribute and therefore inherits from a class that is defined in MyPage.aspx.cs, the class defined in MyPage.aspx.cs must extend the pageBaseType class. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Workarounds:     &lt;br /&gt;&lt;/strong&gt;1. If the pageBaseType class (for example, MyBasePage) is not needed for all pages, you can remove it from the web.config file, or;&lt;/p&gt;  &lt;p&gt;2. Where pages do require the pageBaseType value, modify the classes in the code-behind files to extend the base type. In the filename.aspx.cs code-behind file, make sure that the class inherits from the pageBaseType that is specified in the web.config file (for example, public partial class CodeFileClass : MyBasePage instead of public partial class CodeFileClass : System.Web.UI.Page).&lt;/p&gt;  &lt;p&gt;3. An alternative workaround will allow you to add the following attribute to your page directive: &lt;/p&gt;  &lt;p&gt;CodeFileBaseClass="System.Web.UI.Page"&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1298.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=QWGx2K"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=QWGx2K" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=4Q8Tzk"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=4Q8Tzk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=8H9oBK"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=8H9oBK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=e16rQk"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=e16rQk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=kVJHBK"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=kVJHBK" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/365251108" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/08/14/know-issues--breaking-changes-in-asp.net-3.5-sp1.aspx</guid>
            <pubDate>Fri, 15 Aug 2008 00:44:22 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1298.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/08/14/know-issues--breaking-changes-in-asp.net-3.5-sp1.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1298.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1298.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F08%2F14%2Fknow-issues--breaking-changes-in-asp.net-3.5-sp1.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/08/14/know-issues--breaking-changes-in-asp.net-3.5-sp1.aspx</feedburner:origLink></item>
        <item>
            <title>Find my inane babble on Twitter</title>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/363529483/find-my-inane-babble-on-twitter.aspx</link>
            <description>&lt;p&gt;Keeping the noise down on the blog...you can find the non-lucid stuff on my &lt;a href="http://www.twitter.com/scottgal" target="_blank"&gt;Twitter feed&lt;/a&gt; (warning, cats and pancakes abound!) &lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1297.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=IbCDYK"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=IbCDYK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=aT7dhk"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=aT7dhk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=enlzRK"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=enlzRK" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=7uBb2k"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=7uBb2k" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=vHLn4K"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=vHLn4K" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/363529483" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/08/12/find-my-inane-babble-on-twitter.aspx</guid>
            <pubDate>Wed, 13 Aug 2008 03:29:03 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1297.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/08/12/find-my-inane-babble-on-twitter.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1297.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1297.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F08%2F12%2Ffind-my-inane-babble-on-twitter.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/08/12/find-my-inane-babble-on-twitter.aspx</feedburner:origLink></item>
        <item>
            <title>Premature optimization and user perception...my pet project and CSS Sprites</title>
            <category>.NET</category>
            <category>ASP.NET</category>
            <category>Code Snippets</category>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/333230312/spritey.my-pet-project.aspx</link>
            <description>&lt;p&gt;One of the themes I'm looking at for vNext of ASP.NET is the optimization of sites by reducing the number of server requests required for a single page.&lt;br /&gt;
A new classic in the area of improving the perceived performance of your sites by reducing the number of server roundtrips is &lt;a href="http://stevesouders.com/"&gt;Steven Sounders&lt;/a&gt; book &lt;a href="http://www.amazon.com/High-Performance-Web-Sites-Essential"&gt;'High Performance Websites'&lt;/a&gt;. Steven's book is very small, very readable and probably the best book on anything to do with the web that I've read in years.&lt;br /&gt;
This book was a huge revelation for me...I spent most of my coding career writing the slickest, highest performing code I could...and frankly thinking about the structure of the actualy pages the user sees would've been a better use of my time in a lot of cases. As an example,, &lt;a href="http://www.icslearn.co.uk/"&gt;this was one&lt;/a&gt; of the last sites which I worked on as a full time developer...the code is about the best I ever created, the DB is optimized up the wazoo and I very nearly killed myself trying to make it 'perfect'...but for the hundreds of hours I spent sweating blood over the code you could now spend a couple of thousand dollars on a faster server and improve the performance even more...(even ignoring the fact that it's HUGELY overengineered...even has it's own MVC system and templating feature...hey, I was bored!)&lt;br /&gt;
As servers get faster and programming frameworks get more efficient, the amount of time your web server actually spends processing a page, doing a DB request and whatever else it has to do to generate HTML gets smaller and smaller; with better use of caching, AJAX and other techniques it's likely that you page actually returns it's total content to the user in milliseconds.... You can really only make minimal gains to 'preceived performance' in your sites by optimizing the dynamic code in your web application these days...(and this will likely only reduce over time)&lt;/p&gt;
&lt;p&gt;Welcome to &lt;a href="http://en.wikipedia.org/wiki/Moore's_law"&gt;Moore's law&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The fact is that for 99% of web pages the issue is no longer really about optimizing the amount of time your page takes to return HTML content to the user...it's what happens afterwards which leads to poor download performance.&lt;/p&gt;
&lt;p&gt;The Problem&lt;br /&gt;
&lt;br /&gt;
Websites nowadays have more and more separate elements in a single webpage, images, css, js files, flash content, videos etc...often the number of requests sent from single page can take MANY (as in several orders of magnitude) times longer than the bit we developers commonly fret about. As an example a few seconds ago I requested the &lt;a href="http://www.cnn.com"&gt;CNN&lt;/a&gt; homepage, the actual page of HTML content loaded in 222ms, but the OTHER 153 requests for the rest of the stuff the page needed took a total of 4.65s.&lt;br /&gt;
One way to avoid a large number of these other requests is to combine requests for multiple objects together. In ASP.NET 3.5 SP1 we'll be shipping a feature called &lt;a href="http://www.asp.net/Learn/3.5-SP1/video-296.aspx"&gt;'ASP.NET AJAX Script Combining'&lt;/a&gt;, as the name suggests this feature combines multiple HTTP requests (in this case for the ASP.NET AJAX scripts) into a single request, potentially greatly reducing the number of roundtrips to the server.&lt;br /&gt;
&lt;br /&gt;
Where is this going? &lt;/p&gt;
&lt;p&gt;Well, a feature I've been playing with (and which I'm considering for ASP.NET vNext) is an ASP.NET CSS Sprite Control. Zack Owens has &lt;a href="http://weblogs.asp.net/zowens/archive/2008/03/05/css-sprite-for-asp-net.aspx"&gt;already posted&lt;/a&gt; about a technique for doing this in ASP.NET, but I wanted to increase the usability of generating these sprites; think using an ASP.NET image control and them magically being combined and output as part of a Sprite...&lt;br /&gt;
For those who don't know, &lt;a href="http://css-tricks.com/css-sprites-what-they-are-why-theyre-cool-and-how-to-use-them/"&gt;CSS Sprites&lt;/a&gt; are essentially a technique which involves combining multiple images into one and using CSS to specify which one to show when they download. With this technique you both reduce the number of server requests as well as 'pre-loading' images on the fly (when's the last time you had an image rollover which seemed to stutter as it loaded the next image?).&lt;br /&gt;
Anyway, that's the idea; below is a some ASP.NET markup I'm playing with...this would resuly in a single PNG image being generated, along with a CSS definition for the sprite and for each 'image' to be displayed in the page.&lt;br /&gt;
This is still very much a work in progress and there's a ton of challenges around persisting the generated image in a scalable way etc...But well, I've been quiet of late so I thought I'd let you know what I'm playing with these days...&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;html&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;xmlns&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="http://www.w3.org/1999/xhtml"&amp;gt;&lt;br /&gt;
&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;head&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;runat&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="server"&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;title&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;title&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;cs&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;:&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;SpriteManager&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;runat&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="server"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;GroupName&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="DEFAULTGROUP"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ImageFormat&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="png"&amp;gt;&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;cs&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;:&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;SpriteManager&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&lt;br /&gt;
&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;head&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&lt;br /&gt;
&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;body&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;form&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;id&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="form1"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;runat&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="server"&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;cs&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;:&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;Sprite&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ID&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Sprite"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ReferenceId&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Clock"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;runat&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="server"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ImageUrl&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="~/icons/Clock.ico"/&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;cs&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;:&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;Sprite&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ID&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Sprite1"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ReferenceId&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Contacts"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;runat&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="server"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ImageUrl&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="~/icons/contacts 1.ico"/&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;cs&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;:&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;Sprite&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ID&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Sprite2"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ReferenceId&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Alerts"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;runat&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="server"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ImageUrl&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="~/icons/alerts.ico"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;/&amp;gt;&lt;br /&gt;
&amp;lt;cs:&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;Sprite&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ID&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Sprite3"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ReferenceId&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Download"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;runat&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="server"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ImageUrl&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="~/icons/download.ico"/&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;cs&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;:&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;Sprite&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ID&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Sprite4"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ReferenceId&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="Desktop"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;runat&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="server"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#ff0000" size="1"&gt;&lt;font color="#ff0000" size="1"&gt;ImageUrl&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;="~/icons/desktop.ico"&lt;/font&gt;&lt;/font&gt;&lt;font size="1"&gt; &lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;/&amp;gt;&lt;br /&gt;
&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;form&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&lt;br /&gt;
&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;body&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&lt;br /&gt;
&amp;lt;/&lt;/font&gt;&lt;/font&gt;&lt;font color="#a31515" size="1"&gt;&lt;font color="#a31515" size="1"&gt;html&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff" size="1"&gt;&lt;font color="#0000ff" size="1"&gt;&amp;gt;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;
 &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1296.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=Nb8mYJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=Nb8mYJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=ZKitdj"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=ZKitdj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=OtAS9J"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=OtAS9J" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=P4htOj"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=P4htOj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=oLfEfJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=oLfEfJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/333230312" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/07/11/spritey.my-pet-project.aspx</guid>
            <pubDate>Sat, 12 Jul 2008 02:54:36 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1296.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/07/11/spritey.my-pet-project.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1296.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1296.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F07%2F11%2Fspritey.my-pet-project.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/07/11/spritey.my-pet-project.aspx</feedburner:origLink></item>
        <item>
            <title>Yes, yes I know!</title>
            <link>http://feeds.feedburner.com/~r/mostlylucid/XRDO/~3/326170400/yes-yes-i-know.aspx</link>
            <description>&lt;p&gt;Blog, I have not abandoned you! I'm in a 'quiet' phase right now...be back soon (when work settles down a bit).&lt;/p&gt;&lt;img src="http://mostlylucid.net/aggbug/1295.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=NUNYmJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=NUNYmJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=Fgttej"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=Fgttej" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=5k0kHJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=5k0kHJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=IVefsj"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=IVefsj" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/mostlylucid/XRDO?a=oyzYVJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/mostlylucid/XRDO?i=oyzYVJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/mostlylucid/XRDO/~4/326170400" height="1" width="1"/&gt;</description>
            <dc:creator>Scott Galloway</dc:creator>
            <guid isPermaLink="false">http://mostlylucid.net/archive/2008/07/03/yes-yes-i-know.aspx</guid>
            <pubDate>Thu, 03 Jul 2008 22:47:36 GMT</pubDate>
            <wfw:comment>http://mostlylucid.net/comments/1295.aspx</wfw:comment>
            <comments>http://mostlylucid.net/archive/2008/07/03/yes-yes-i-know.aspx#feedback</comments>
            <wfw:commentRss>http://mostlylucid.net/comments/commentRss/1295.aspx</wfw:commentRss>
            <trackback:ping>http://mostlylucid.net/services/trackbacks/1295.aspx</trackback:ping>
        <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=mostlylucid/XRDO&amp;itemurl=http%3A%2F%2Fmostlylucid.net%2Farchive%2F2008%2F07%2F03%2Fyes-yes-i-know.aspx</feedburner:awareness><feedburner:origLink>http://mostlylucid.net/archive/2008/07/03/yes-yes-i-know.aspx</feedburner:origLink></item>
    <feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetFeedData?uri=mostlylucid/XRDO</feedburner:awareness></channel>
</rss>
