<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>Manuel Abadia's ASP.NET stuff</title>
    <link>http://www.manuelabadia.com/blog/</link>
    <description />
    <language>en-us</language>
    <copyright>Manuel Abadia</copyright>
    <lastBuildDate>Mon, 22 Dec 2008 23:35:20 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>blogcomments@manuelabadia.com</managingEditor>
    <webMaster>blogcomments@manuelabadia.com</webMaster>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ManuelAbadia" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <trackback:ping>http://www.manuelabadia.com/blog/Trackback.aspx?guid=0606d95f-56ae-4dd7-8458-69cd550fa356</trackback:ping>
      <pingback:server>http://www.manuelabadia.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.manuelabadia.com/blog/PermaLink,guid,0606d95f-56ae-4dd7-8458-69cd550fa356.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.manuelabadia.com/blog/CommentView,guid,0606d95f-56ae-4dd7-8458-69cd550fa356.aspx</wfw:comment>
      <wfw:commentRss>http://www.manuelabadia.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=0606d95f-56ae-4dd7-8458-69cd550fa356</wfw:commentRss>
      <slash:comments>1</slash:comments>
      
      <title>Binding a DropDownList to multiple properties and to nested properties</title>
      <guid isPermaLink="false">http://www.manuelabadia.com/blog/PermaLink,guid,0606d95f-56ae-4dd7-8458-69cd550fa356.aspx</guid>
      <link>http://www.manuelabadia.com/blog/PermaLink,guid,0606d95f-56ae-4dd7-8458-69cd550fa356.aspx</link>
      <pubDate>Mon, 22 Dec 2008 23:35:20 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
All controls that inherit from ListControl (BulletedList, CheckBoxList, DropDownList,&#xD;
ListBox and RadioButtonList) have some annoying behavior in common: &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
You can only bind the control to a single property using the DataTextField property.&#xD;
For example, if you have a Customer class with properties Id, Name, Surname, etc and&#xD;
you want to show the full name of a customer in any of the ListControls, you have&#xD;
several options:&#xD;
&lt;/p&gt;&#xD;
        &lt;ol&gt;&#xD;
          &lt;li&gt;&#xD;
When you get the data from the database, return another column with the name and surname. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Create a property (f.e. FullName) that returns what you want to show. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Use a DataSet and add a computed column. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Manually add ListItems with the appropriate values performing the data bind manually. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Create a simple class that will be bound (instead of the original one) just to fix&#xD;
the problem.&lt;/li&gt;&#xD;
        &lt;/ol&gt;&#xD;
        &lt;p&gt;&#xD;
The truth is that I don’t like any of those options, all of them are hacks. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For nested properties you have the similar problems. You can bind to Id or Name, but&#xD;
you can’t bind to Address.City or Address.Zip.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Today I faced this problem again and I decided to investigate a more innovative solution.&#xD;
The problem itself is in the controls that inherit from ListControl that are very&#xD;
strict in the binding options. So I took a look of how the controls perform the binding&#xD;
to see if I could do anything to overcome those limitations. At first sight I thought&#xD;
I was loosing my time but after a deeper study I found that it was amazingly easy&#xD;
to fix those problems in a very sleek way.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The data binding of the controls is performed in the PerformDataBinding method. The&#xD;
code at ListControl.PerformDataBinding uses DataBinder.GetPropertyValue to retrieve&#xD;
the value to show in the control if you set the DataTextField property. However, DataBinder.GetPropertyValue&#xD;
doesn’t handle nested properties. DataBinder.Eval is a better choice because it does&#xD;
handle nested properties. So using it we solve one problem. The other problem can&#xD;
be solved easily as well. As we have two properties that control how the Text of each&#xD;
ListItem will be extracted and shown from the data source, with a bit more of effort&#xD;
we can handle the new functionality. I have come up with a very intuitive solution:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
DataTextField allows one or more properties (that can be nested if needed) separated&#xD;
by commas. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
DataTextFormatString can be used to control the formatting of the items, using {0},&#xD;
{1}, {2}, {3}… as the value of the properties specified with DataTextField.&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
The code that performs the data binding is:&#xD;
&lt;/p&gt;&#xD;
        &lt;div class="csharp" style="BORDER-RIGHT: #d0d0d0 1px solid; BORDER-TOP: #d0d0d0 1px solid; BORDER-LEFT: #d0d0d0 1px solid; COLOR: #006; BORDER-BOTTOM: #d0d0d0 1px solid; FONT-FAMILY: monospace; BACKGROUND-COLOR: #f0f0f0"&gt;&#xD;
          &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;///&#xD;
&amp;lt;summary&amp;gt;Binds the data to the control.&amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
          &lt;br&gt;&#xD;
          &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;/// &amp;lt;param name="ctrl"&amp;gt;control&#xD;
to bind.&amp;lt;/param&amp;gt;&lt;/span&gt;&#xD;
          &lt;br&gt;&#xD;
          &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;/// &amp;lt;param name="dataSource"&amp;gt;data&#xD;
to bind to the control.&amp;lt;/param&amp;gt;&lt;/span&gt;&#xD;
          &lt;br&gt;&#xD;
          &lt;span style="COLOR: #0600ff"&gt;public&lt;/span&gt;&#xD;
          &lt;span style="COLOR: #0600ff"&gt;static&lt;/span&gt;&#xD;
          &lt;span style="COLOR: #0600ff"&gt;void&lt;/span&gt; PerformDataBinding&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;ListControl&#xD;
ctrl, IEnumerable dataSource&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
    &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;// resets the selected&#xD;
item&lt;/span&gt;&lt;br&gt;&#xD;
    ctrl.&lt;span style="COLOR: #0000ff"&gt;SelectedIndex&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;-&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;1&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
    ctrl.&lt;span style="COLOR: #0000ff"&gt;SelectedValue&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; null&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&#xD;
    &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;dataSource &lt;span style="COLOR: #008000"&gt;!=&lt;/span&gt;&lt;span style="COLOR: #0600ff"&gt;null&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #ff0000"&gt;bool&lt;/span&gt; fieldInfoSet &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; false&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #ff0000"&gt;bool&lt;/span&gt; dataTextFormatStringSet &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; false&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;// checks&#xD;
if we have to clear the existing items&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;!&lt;/span&gt;ctrl.&lt;span style="COLOR: #0000ff"&gt;AppendDataBoundItems&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
            ctrl.&lt;span style="COLOR: #0000ff"&gt;Items&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Clear&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;// if&#xD;
the data source is a collection, sets the capacity&lt;/span&gt;&lt;br&gt;&#xD;
        ICollection soureceCollection &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; dataSource &lt;span style="COLOR: #0600ff"&gt;as&lt;/span&gt; ICollection&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;soureceCollection &lt;span style="COLOR: #008000"&gt;!=&lt;/span&gt;&lt;span style="COLOR: #0600ff"&gt;null&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
            ctrl.&lt;span style="COLOR: #0000ff"&gt;Items&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Capacity&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; soureceCollection.&lt;span style="COLOR: #0000ff"&gt;Count&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;+&lt;/span&gt; ctrl.&lt;span style="COLOR: #0000ff"&gt;Items&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Count&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;// save&#xD;
if the data text field of data value field has been set&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;ctrl.&lt;span style="COLOR: #0000ff"&gt;DataTextField&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Length&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;!=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;0&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;||&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;ctrl.&lt;span style="COLOR: #0000ff"&gt;DataValueField&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Length&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;!=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;0&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
            fieldInfoSet &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; true&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;// save&#xD;
if the data text format string has been set&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;ctrl.&lt;span style="COLOR: #0000ff"&gt;DataTextFormatString&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Length&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;!=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;0&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
            dataTextFormatStringSet &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; true&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;// iterates&#xD;
through the data source creating the ListItems&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #0600ff"&gt;foreach&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;object&lt;/span&gt; obj &lt;span style="COLOR: #0600ff"&gt;in&lt;/span&gt; dataSource&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
            ListItem item &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt;&lt;a style="COLOR: #000060" href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;&lt;span style="COLOR: #008000"&gt;new&lt;/span&gt;&lt;/a&gt; ListItem&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&#xD;
            &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;fieldInfoSet&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
                &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;ctrl.&lt;span style="COLOR: #0000ff"&gt;DataTextField&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Length&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;0&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
                    &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;ctrl.&lt;span style="COLOR: #0000ff"&gt;DataTextField&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;IndexOf&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #666666"&gt;','&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;==&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;-&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;1&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
                       &#xD;
item.&lt;span style="COLOR: #0000ff"&gt;Text&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; DataBinder.&lt;span style="COLOR: #0000ff"&gt;Eval&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;obj,&#xD;
ctrl.&lt;span style="COLOR: #0000ff"&gt;DataTextField&lt;/span&gt;, ctrl.&lt;span style="COLOR: #0000ff"&gt;DataTextFormatString&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
                    &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;span style="COLOR: #0600ff"&gt;else&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
                        &lt;span style="COLOR: #008080; FONT-STYLE: italic"&gt;//&#xD;
if the DataTextField property has a list of fields, get them to create the text of&#xD;
the item&lt;/span&gt;&lt;br&gt;&#xD;
                        &lt;span style="COLOR: #ff0000"&gt;string&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt; fields &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; ctrl.&lt;span style="COLOR: #0000ff"&gt;DataTextField&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Split&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;a style="COLOR: #000060" href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;&lt;span style="COLOR: #008000"&gt;new&lt;/span&gt;&lt;/a&gt;&lt;span style="COLOR: #ff0000"&gt;string&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;span style="COLOR: #666666"&gt;","&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;,&#xD;
StringSplitOptions.&lt;span style="COLOR: #0000ff"&gt;RemoveEmptyEntries&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
                        &lt;span style="COLOR: #ff0000"&gt;object&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt; values &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt;&lt;a style="COLOR: #000060" href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;&lt;span style="COLOR: #008000"&gt;new&lt;/span&gt;&lt;/a&gt;&lt;span style="COLOR: #ff0000"&gt;object&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;fields.&lt;span style="COLOR: #0000ff"&gt;Length&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&lt;br&gt;&#xD;
                        &lt;span style="COLOR: #0600ff"&gt;for&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;int&lt;/span&gt; i &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;0&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt; i &lt;span style="COLOR: #008000"&gt;&amp;lt;&lt;/span&gt; fields.&lt;span style="COLOR: #0000ff"&gt;Length&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt; i&lt;span style="COLOR: #008000"&gt;++&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
                       &#xD;
    &lt;span style="COLOR: #ff0000"&gt;string&lt;/span&gt; field &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; fields&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;i&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
                       &#xD;
    values&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;i&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; DataBinder.&lt;span style="COLOR: #0000ff"&gt;Eval&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;obj,&#xD;
field&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
                        &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&lt;br&gt;&#xD;
                       &#xD;
item.&lt;span style="COLOR: #0000ff"&gt;Text&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;String&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Format&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;ctrl.&lt;span style="COLOR: #0000ff"&gt;DataTextFormatString&lt;/span&gt;,&#xD;
values&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
                    &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&#xD;
                &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&#xD;
                &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;ctrl.&lt;span style="COLOR: #0000ff"&gt;DataValueField&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Length&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;0&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
                    item.&lt;span style="COLOR: #0000ff"&gt;Value&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; DataBinder.&lt;span style="COLOR: #0000ff"&gt;Eval&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;obj,&#xD;
ctrl.&lt;span style="COLOR: #0000ff"&gt;DataValueField&lt;/span&gt;, &lt;span style="COLOR: #0600ff"&gt;null&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
                &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&#xD;
            &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;span style="COLOR: #0600ff"&gt;else&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
                &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;dataTextFormatStringSet&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
                    item.&lt;span style="COLOR: #0000ff"&gt;Text&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;string&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Format&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;CultureInfo.&lt;span style="COLOR: #0000ff"&gt;CurrentCulture&lt;/span&gt;,&#xD;
ctrl.&lt;span style="COLOR: #0000ff"&gt;DataTextFormatString&lt;/span&gt;, &lt;a style="COLOR: #000060" href="http://www.google.com/search?q=new+msdn.microsoft.com"&gt;&lt;span style="COLOR: #008000"&gt;new&lt;/span&gt;&lt;/a&gt;&lt;span style="COLOR: #ff0000"&gt;object&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt; obj &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
                &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;span style="COLOR: #0600ff"&gt;else&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;&lt;br&gt;&#xD;
                    item.&lt;span style="COLOR: #0000ff"&gt;Text&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; obj.&lt;span style="COLOR: #0000ff"&gt;ToString&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
                &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&#xD;
                item.&lt;span style="COLOR: #0000ff"&gt;Value&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; obj.&lt;span style="COLOR: #0000ff"&gt;ToString&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
            &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&#xD;
            &#xD;
&lt;br&gt;&#xD;
            ctrl.&lt;span style="COLOR: #0000ff"&gt;Items&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Add&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;item&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&#xD;
    &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;&lt;/div&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As we need to call this data binding code instead of the one from ListControl I needed&#xD;
to subclass all controls that inherit from ListControl in order to fix them. So now&#xD;
I have BulletedListEx, CheckBoxListEx, DropDownListEx, ListBoxEx and RadioButtonListEx.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I have created a simple example showing how to use them. Imagine that an Item can&#xD;
be supplied by a set of suppliers, and each supplier sells the item with a different&#xD;
price. The following image shows the properties of the 3 entities of the sample:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/listcontrolex_sample.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
I have created a web page with a DropDownList with some items, and when you select&#xD;
an item in the DropDownList you will see a ListBox with the all suppliers of that&#xD;
item with the associated price for the item. Notice how I show the Id and the Name&#xD;
in the DropDownList and how I show the price, supplier Id and supplier name in the&#xD;
ListBox:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/listcontrolex_sample2.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The ASPX of the page follows:&#xD;
&lt;/p&gt;&#xD;
        &lt;div class="xml" style="BORDER-RIGHT: #d0d0d0 1px solid; BORDER-TOP: #d0d0d0 1px solid; BORDER-LEFT: #d0d0d0 1px solid; COLOR: #006; BORDER-BOTTOM: #d0d0d0 1px solid; FONT-FAMILY: monospace; BACKGROUND-COLOR: #f0f0f0"&gt;&#xD;
          &lt;span style="COLOR: #009900"&gt;&#xD;
            &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;body&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&#xD;
          &lt;/span&gt;&#xD;
          &lt;br&gt;&#xD;
    &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;form&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"form1"&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;runat&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"server"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
    &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
    &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
        Choose an item to see the suppliers:&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
        Items:&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;manu:DropDownListEx&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;ID&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"DropDownListEx1"&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;runat&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"server"&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;AutoPostBack&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"True"&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;Width&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"300px"&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #009900"&gt;            &lt;span style="COLOR: #000066"&gt;DataTextField&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Id,&#xD;
Name"&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #009900"&gt;            &lt;span style="COLOR: #000066"&gt;DataTextFormatString&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"[{0}]&#xD;
- {1}"&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #009900"&gt;            &lt;span style="COLOR: #000066"&gt;DataValueField&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Id"&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #009900"&gt;            &lt;span style="COLOR: #000066"&gt;OnSelectedIndexChanged&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"DropDownListEx1_SelectedIndexChanged"&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;AppendDataBoundItems&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"True"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
            &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;asp:ListItem&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;Selected&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"True"&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;Value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"0"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;Select&#xD;
an Item&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/asp:ListItem&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/manu:DropDownListEx&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
        &#xD;
&lt;br&gt;&#xD;
        Price and suppliers:&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
        &#xD;
&lt;br&gt;&#xD;
        &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;manu:ListBoxEx&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;ID&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"ListBoxEx1"&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;runat&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"server"&lt;/span&gt;&lt;span style="COLOR: #000066"&gt;Width&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"300px"&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #009900"&gt;            &lt;span style="COLOR: #000066"&gt;DataTextField&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Price,&#xD;
Supplier.Id, Supplier.Name"&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #009900"&gt;            &lt;span style="COLOR: #000066"&gt;DataTextFormatString&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"{0}&#xD;
- [{1}] {2}"&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #009900"&gt;            &lt;span style="COLOR: #000066"&gt;DataValueField&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Supplier.Id"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
        &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/manu:ListBoxEx&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&#xD;
    &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/form&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/body&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As you can see, the solution is really clean and elegant, and backward compatible&#xD;
with the current controls that inherit from ListControl.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
That’s all for now,&lt;br&gt;&#xD;
Merry christmas!&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/content/binary/ListControlsEx_bin.zip"&gt;ListControlsEx_bin.zip&#xD;
(6.53 KB)&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;a href="http://www.manuelabadia.com/blog/content/binary/ListControlsEx_sample.zip"&gt;ListControlsEx_sample.zip&#xD;
(33.75 KB)&lt;/a&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.manuelabadia.com/blog/aggbug.ashx?id=0606d95f-56ae-4dd7-8458-69cd550fa356"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=7I5vk_OAjkw:dBkwbiFnbRo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=7I5vk_OAjkw:dBkwbiFnbRo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=7I5vk_OAjkw:dBkwbiFnbRo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=7I5vk_OAjkw:dBkwbiFnbRo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=7I5vk_OAjkw:dBkwbiFnbRo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=7I5vk_OAjkw:dBkwbiFnbRo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=7I5vk_OAjkw:dBkwbiFnbRo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.manuelabadia.com/blog/CommentView,guid,0606d95f-56ae-4dd7-8458-69cd550fa356.aspx</comments>
      <category>ASP.NET;Microsoft .NET Framework</category>
    </item>
    <item>
      <trackback:ping>http://www.manuelabadia.com/blog/Trackback.aspx?guid=7924eaf8-b406-43af-9444-b816f6dfa246</trackback:ping>
      <pingback:server>http://www.manuelabadia.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.manuelabadia.com/blog/PermaLink,guid,7924eaf8-b406-43af-9444-b816f6dfa246.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.manuelabadia.com/blog/CommentView,guid,7924eaf8-b406-43af-9444-b816f6dfa246.aspx</wfw:comment>
      <wfw:commentRss>http://www.manuelabadia.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=7924eaf8-b406-43af-9444-b816f6dfa246</wfw:commentRss>
      <slash:comments>11</slash:comments>
      <title>Search Engine Optimization - Moving View State to the bottom of the page</title>
      <guid isPermaLink="false">http://www.manuelabadia.com/blog/PermaLink,guid,7924eaf8-b406-43af-9444-b816f6dfa246.aspx</guid>
      <link>http://www.manuelabadia.com/blog/PermaLink,guid,7924eaf8-b406-43af-9444-b816f6dfa246.aspx</link>
      <pubDate>Thu, 04 Dec 2008 19:26:16 GMT</pubDate>
      <description>&lt;p&gt;
One of the greatest problems when trying to optimize an ASP.NET page to be more search
engine friendly is the view state hidden field. Most search engines give more score
to the content of the firsts thousands of bytes of the document so if your first 2
KB are view state junk your pages are penalized. So the goal here is to move the view
state data as down as possible. 
&lt;/p&gt;
&lt;p&gt;
I have seen some approaches to solve this problem rewriting the final HTML code of
the response. While this approach works I think that it wastes some precious processor
cycles that can be used to do other things. So I needed a way to do the same thing
without wasting that CPU time. After some large reflector sessions I found a way to
do it. My method uses the ASP.NET Control Adapter Architecture. 
&lt;/p&gt;
&lt;p&gt;
A control adapter is a class that can be used to control the HTML generated by the
control it adapts. Since the Page class is the responsible of rendering the view state
hidden field (Page.BeginFormRender calls Page.RenderViewStateFields), an adapter for
the Page is needed. However, the view state hidden field plays a key role in the ASP.NET
infrastructure (for example, the Page.IsPostBack property checks if the view state
hidden field has been posted) and it is difficult to modify the associated HTML. 
&lt;/p&gt;
&lt;p&gt;
A PageAdapter has a method called GetStatePersister() that returns an object that
inherits from PageStatePersister. The PageStatePersister is called when it is time
to load and save the view state. There are 2 classes that inherit from PageStatePersister:
HiddenFieldPageStatePersister and SessionPageStatePersister. The first one is the
default, which stores the view state in the hidden field called __VIEWSTATE. The second
one stores the view state in the session. So, we can easily create a custom PageStatePersister
to control the view state load and save process. The big problem is how to create
the hidden view state field before the closing form tag while being a fully transparent
solution. After some tries I came up with a solution that I was happy with. 
&lt;/p&gt;
&lt;p&gt;
I realized that it was impossible to completely remove the view state hidden field
from the top of the page, because it plays a key role in the ASP.NET infrastructure.
However, with any custom page state persister the ASP.NET infrastructure renders at
least an empty view state hidden field of only 70 bytes: 
&lt;/p&gt;
&lt;div class=html4strict style="BORDER-RIGHT: #d0d0d0 1px solid; BORDER-TOP: #d0d0d0 1px solid; BORDER-LEFT: #d0d0d0 1px solid; COLOR: #006; BORDER-BOTTOM: #d0d0d0 1px solid; FONT-FAMILY: monospace; BACKGROUND-COLOR: #f0f0f0"&gt;&lt;span style="COLOR: #009900"&gt;&amp;lt;&lt;a style="COLOR: #000060" href="http://december.com/html/4/element/input.html"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;input&lt;/span&gt;&lt;/a&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;&lt;span style="COLOR: #66cc66"&gt;=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;"hidden"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;&lt;span style="COLOR: #66cc66"&gt;=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;"__VIEWSTATE"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;&lt;span style="COLOR: #66cc66"&gt;=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;"__VIEWSTATE"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;&lt;span style="COLOR: #66cc66"&gt;=&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;""&lt;/span&gt; &lt;span style="COLOR: #66cc66"&gt;/&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
My page adapter adds a hidden field to the bottom of the form called __SEOVIEWSTATE
with the actual view state data, and the only limitation that it has it is that you
can not use &lt;% %&gt;expressions directly inside the asp.net form. However, this restriction
can be easily avoided putting the &lt;% %&gt;expression in a PlaceHolder control or inside
another control. For an in-depth explanation of this limitation take a look &lt;a href="http://www.west-wind.com/WebLog/posts/6148.aspx"&gt;here&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Let’s see an example of the adapter in action. The following ASP.NET page: 
&lt;/p&gt;
&lt;div class=xml style="BORDER-RIGHT: #d0d0d0 1px solid; BORDER-TOP: #d0d0d0 1px solid; BORDER-LEFT: #d0d0d0 1px solid; COLOR: #006; BORDER-BOTTOM: #d0d0d0 1px solid; FONT-FAMILY: monospace; BACKGROUND-COLOR: #f0f0f0"&gt;&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;&lt;/span&gt;%@
Page &lt;span style="COLOR: #000066"&gt;Language&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"C#"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;AutoEventWireup&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"true"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;CodeBehind&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Default.aspx.cs"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;Inherits&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"SEOViewStateAdapterTest._Default"&lt;/span&gt; %&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #00bbdd"&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;html&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;xmlns&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;head&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;runat&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"server"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;title&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/title&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/head&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;body&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;form&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"form1"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;runat&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"server"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enter a message: &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;asp:TextBox&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;ID&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"txtMessage"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;runat&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"server"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/asp:TextBox&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;asp:Button&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;ID&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"bSaveMessage"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;runat&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"server"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;Text&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Save
Message"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;onclick&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"bSaveMessage_Click"&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;asp:Label&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;ID&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"lMessage"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;runat&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"server"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/asp:Label&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;p&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Page
generated at &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;asp:PlaceHolder&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;ID&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"PlaceHolder1"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;runat&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"server"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;&lt;/span&gt;%=
DateTime.Now.ToString&lt;span style="COLOR: #66cc66"&gt;(&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;"hh:mm
dd/MM/yyy"&lt;/span&gt;&lt;span style="COLOR: #66cc66"&gt;)&lt;/span&gt; %&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/asp:PlaceHolder&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/p&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/form&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/body&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/html&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
With the associated code: 
&lt;/p&gt;
&lt;div class=csharp style="BORDER-RIGHT: #d0d0d0 1px solid; BORDER-TOP: #d0d0d0 1px solid; BORDER-LEFT: #d0d0d0 1px solid; COLOR: #006; BORDER-BOTTOM: #d0d0d0 1px solid; FONT-FAMILY: monospace; BACKGROUND-COLOR: #f0f0f0"&gt;&lt;span style="COLOR: #0600ff"&gt;using&lt;/span&gt; &lt;span style="COLOR: #008080"&gt;System&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0600ff"&gt;using&lt;/span&gt; &lt;span style="COLOR: #008080"&gt;System.Collections.Generic&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0600ff"&gt;using&lt;/span&gt; &lt;span style="COLOR: #008080"&gt;System.Web&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0600ff"&gt;using&lt;/span&gt; &lt;span style="COLOR: #008080"&gt;System.Web.UI&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0600ff"&gt;using&lt;/span&gt; &lt;span style="COLOR: #008080"&gt;System.Web.UI.WebControls&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #0600ff"&gt;namespace&lt;/span&gt; SEOViewStateAdapterTest&lt;br&gt;
&lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #0600ff"&gt;public&lt;/span&gt; &lt;span style="COLOR: #0600ff"&gt;partial&lt;/span&gt; &lt;span style="COLOR: #ff0000"&gt;class&lt;/span&gt; _Default &lt;span style="COLOR: #008000"&gt;:&lt;/span&gt; &lt;span style="COLOR: #000000"&gt;System.&lt;span style="COLOR: #0000ff"&gt;Web&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;UI&lt;/span&gt;&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Page&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #0600ff"&gt;protected&lt;/span&gt; &lt;span style="COLOR: #0600ff"&gt;void&lt;/span&gt; Page_Load&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;object&lt;/span&gt; sender,
EventArgs e&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #0600ff"&gt;if&lt;/span&gt; &lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;!&lt;/span&gt;Page.&lt;span style="COLOR: #0000ff"&gt;IsPostBack&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt; &lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ViewState&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;&lt;span style="COLOR: #666666"&gt;"previousMessage"&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt; &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; txtMessage.&lt;span style="COLOR: #0000ff"&gt;Text&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #0600ff"&gt;protected&lt;/span&gt; &lt;span style="COLOR: #0600ff"&gt;void&lt;/span&gt; bSaveMessage_Click&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;object&lt;/span&gt; sender,
EventArgs e&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #000000"&gt;{&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; lMessage.&lt;span style="COLOR: #0000ff"&gt;Text&lt;/span&gt; &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; &lt;span style="COLOR: #ff0000"&gt;String&lt;/span&gt;.&lt;span style="COLOR: #0000ff"&gt;Format&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #666666"&gt;"The
current message is '{0}'. The previous message was '{1}'"&lt;/span&gt;, txtMessage.&lt;span style="COLOR: #0000ff"&gt;Text&lt;/span&gt;, &lt;span style="COLOR: #000000"&gt;(&lt;/span&gt;&lt;span style="COLOR: #ff0000"&gt;string&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;ViewState&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;&lt;span style="COLOR: #666666"&gt;"previousMessage"&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;)&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ViewState&lt;span style="COLOR: #000000"&gt;[&lt;/span&gt;&lt;span style="COLOR: #666666"&gt;"previousMessage"&lt;/span&gt;&lt;span style="COLOR: #000000"&gt;]&lt;/span&gt; &lt;span style="COLOR: #008000"&gt;=&lt;/span&gt; txtMessage.&lt;span style="COLOR: #0000ff"&gt;Text&lt;/span&gt;&lt;span style="COLOR: #008000"&gt;;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #000000"&gt;}&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
after a couple of postbacks, without using the adapter, the HTML looks like this: 
&lt;/p&gt;
&lt;div class=xml style="BORDER-RIGHT: #d0d0d0 1px solid; BORDER-TOP: #d0d0d0 1px solid; BORDER-LEFT: #d0d0d0 1px solid; COLOR: #006; BORDER-BOTTOM: #d0d0d0 1px solid; FONT-FAMILY: monospace; BACKGROUND-COLOR: #f0f0f0"&gt;&lt;span style="COLOR: #00bbdd"&gt;&amp;lt;!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;html&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;xmlns&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;head&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;title&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/title&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/head&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;body&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;form&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"form1"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;method&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"post"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;action&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Default.aspx"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"form1"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"hidden"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__VIEWSTATE"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__VIEWSTATE"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"/wEPDwUJc01l[...]VwP+cfdSWI6Q=="&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"hidden"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__EVENTVALIDATION"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__EVENTVALIDATION"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"/wEWAwKb4uenCgK/1s7/DwKf8MMPfiUvZtKPSXk//XdxkLooz8QDI0Y="&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enter a message: &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"txtMessage"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"text"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Message
2"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"txtMessage"&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"submit"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"bSaveMessage"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Save
Message"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"bSaveMessage"&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;span&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"lMessage"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;The
current message is 'Message 2'. The previous message was 'Message 1'&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/span&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;p&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Page
generated at 08:13 04/12/2008&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/p&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/form&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/body&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/html&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
and after a couple of postbacks, using the adapter, the HTML looks like this: 
&lt;/p&gt;
&lt;div class=xml style="BORDER-RIGHT: #d0d0d0 1px solid; BORDER-TOP: #d0d0d0 1px solid; BORDER-LEFT: #d0d0d0 1px solid; COLOR: #006; BORDER-BOTTOM: #d0d0d0 1px solid; FONT-FAMILY: monospace; BACKGROUND-COLOR: #f0f0f0"&gt;&lt;span style="COLOR: #00bbdd"&gt;&amp;lt;!DOCTYPE
html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&amp;gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;html&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;xmlns&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;head&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;title&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/title&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/head&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;body&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;form&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"form1"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;method&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"post"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;action&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Default.aspx"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"form1"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"hidden"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__VIEWSTATE"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__VIEWSTATE"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;""&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"hidden"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__EVENTVALIDATION"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__EVENTVALIDATION"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"/wEWAwL+raDpAgK/1s7/DwKf8MMPyF7nqN1AbwNwFBq8OAjEAQorsyo="&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Enter a message: &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"txtMessage"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"text"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Message
2"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"txtMessage"&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"submit"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"bSaveMessage"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Save
Message"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"bSaveMessage"&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;span&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"lMessage"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;The
current message is 'Message 2'. The previous message was 'Message 1'&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/span&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;br&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;p&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Page
generated at 08:11 04/12/2008&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/p&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/div&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;type&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"hidden"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;name&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__SEOVIEWSTATE"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;id&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"__SEOVIEWSTATE"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;value&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"/wEPc01lc3[...]CdNY6AtgigHvU="&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/form&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/body&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/html&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
In order to use the adapter, you have to add a reference to the assembly and add a
file called SEOViewStateAdapter.browser (the name of the file does not matter. The
extension needs to be the same. Or also you could merge the contents to another file
if you already have one) to the App_Browsers folder. The content of the file should
be: 
&lt;/p&gt;
&lt;div class=xml style="BORDER-RIGHT: #d0d0d0 1px solid; BORDER-TOP: #d0d0d0 1px solid; BORDER-LEFT: #d0d0d0 1px solid; COLOR: #006; BORDER-BOTTOM: #d0d0d0 1px solid; FONT-FAMILY: monospace; BACKGROUND-COLOR: #f0f0f0"&gt;&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;browsers&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #808080; FONT-STYLE: italic"&gt;&amp;lt;!-- use the adapters
for all browsers --&amp;gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;browser&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;refID&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Default"&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;controlAdapters&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #808080; FONT-STYLE: italic"&gt;&amp;lt;!--
ths adapter is used to save the view and control state at the bottom of the form so
the page is more friendly to search engines --&amp;gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;adapter&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;controlType&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"System.Web.UI.Page"&lt;/span&gt; &lt;span style="COLOR: #000066"&gt;adapterType&lt;/span&gt;=&lt;span style="COLOR: #ff0000"&gt;"Manu.Web.Adapters.SEOFriendlyViewStatePageAdapter,
SEOViewStateAdapter"&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/controlAdapters&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp; &amp;nbsp; &lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/browser&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #009900"&gt;&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;lt;/browsers&lt;span style="FONT-WEIGHT: bold; COLOR: #000000"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;
&lt;/div&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
That’s all. Enjoy!
&lt;/p&gt;
&lt;a href="http://www.manuelabadia.com/blog/content/binary/SEOViewState.zip"&gt;SEOViewState.zip
(29.67 KB)&lt;/a&gt;&lt;img width="0" height="0" src="http://www.manuelabadia.com/blog/aggbug.ashx?id=7924eaf8-b406-43af-9444-b816f6dfa246" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=5zQS9jfe05c:8GmfRVgkYcc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=5zQS9jfe05c:8GmfRVgkYcc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=5zQS9jfe05c:8GmfRVgkYcc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=5zQS9jfe05c:8GmfRVgkYcc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=5zQS9jfe05c:8GmfRVgkYcc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=5zQS9jfe05c:8GmfRVgkYcc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=5zQS9jfe05c:8GmfRVgkYcc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.manuelabadia.com/blog/CommentView,guid,7924eaf8-b406-43af-9444-b816f6dfa246.aspx</comments>
      <category>ASP.NET;Microsoft .NET Framework;SEO</category>
    </item>
    <item>
      <trackback:ping>http://www.manuelabadia.com/blog/Trackback.aspx?guid=04e66909-e2ab-4869-8a1f-ae2348bf7e47</trackback:ping>
      <pingback:server>http://www.manuelabadia.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.manuelabadia.com/blog/PermaLink,guid,04e66909-e2ab-4869-8a1f-ae2348bf7e47.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.manuelabadia.com/blog/CommentView,guid,04e66909-e2ab-4869-8a1f-ae2348bf7e47.aspx</wfw:comment>
      <wfw:commentRss>http://www.manuelabadia.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=04e66909-e2ab-4869-8a1f-ae2348bf7e47</wfw:commentRss>
      
      <title>XHTML Validation Module Enhancement</title>
      <guid isPermaLink="false">http://www.manuelabadia.com/blog/PermaLink,guid,04e66909-e2ab-4869-8a1f-ae2348bf7e47.aspx</guid>
      <link>http://www.manuelabadia.com/blog/PermaLink,guid,04e66909-e2ab-4869-8a1f-ae2348bf7e47.aspx</link>
      <pubDate>Wed, 13 Aug 2008 23:12:04 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
I have been using &lt;a href="http://www.thejoyofcode.com/Validator_Module.aspx"&gt;Josh&#xD;
Twist’s XHTML validation module&lt;/a&gt; for a while and I have added a couple of small&#xD;
enhancements I have found useful:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
It works without internet access as I included the required DTDs as embedded resources.&#xD;
I usually have internet access when I’m using it, but it is a big problem if I don’t. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
It doesn’t validate ASP.NET trace output if it is present in the page. This is checked&#xD;
using the trace configuration section. I have not found a way to know if trace output&#xD;
is enabled in the current request. &#xD;
&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
I have added an attribute called showErrorsOnly to the validatorModule element to&#xD;
avoid calling the Renderer.Render method if there isn’t any error. That way, if the&#xD;
page validates successfully no message is shown. &#xD;
&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/content/binary/validator_bin.zip"&gt;Download&#xD;
validator_binaries (42,78 KB)&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/content/binary/validator_src.zip"&gt;Downlaod&#xD;
Validator_source code (44,04 KB)&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.manuelabadia.com/blog/aggbug.ashx?id=04e66909-e2ab-4869-8a1f-ae2348bf7e47"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=0FdYaT9eiUI:snTDnWDOwjw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=0FdYaT9eiUI:snTDnWDOwjw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=0FdYaT9eiUI:snTDnWDOwjw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=0FdYaT9eiUI:snTDnWDOwjw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=0FdYaT9eiUI:snTDnWDOwjw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=0FdYaT9eiUI:snTDnWDOwjw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=0FdYaT9eiUI:snTDnWDOwjw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.manuelabadia.com/blog/CommentView,guid,04e66909-e2ab-4869-8a1f-ae2348bf7e47.aspx</comments>
      <category>ASP.NET;XHTML</category>
    </item>
    <item>
      <trackback:ping>http://www.manuelabadia.com/blog/Trackback.aspx?guid=a93878c1-bd98-40d1-81cb-8bbfb6f0bb63</trackback:ping>
      <pingback:server>http://www.manuelabadia.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.manuelabadia.com/blog/PermaLink,guid,a93878c1-bd98-40d1-81cb-8bbfb6f0bb63.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.manuelabadia.com/blog/CommentView,guid,a93878c1-bd98-40d1-81cb-8bbfb6f0bb63.aspx</wfw:comment>
      <wfw:commentRss>http://www.manuelabadia.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=a93878c1-bd98-40d1-81cb-8bbfb6f0bb63</wfw:commentRss>
      <slash:comments>2</slash:comments>
      
      <title>Update to my NHibernate Custom Membership and Role Providers</title>
      <guid isPermaLink="false">http://www.manuelabadia.com/blog/PermaLink,guid,a93878c1-bd98-40d1-81cb-8bbfb6f0bb63.aspx</guid>
      <link>http://www.manuelabadia.com/blog/PermaLink,guid,a93878c1-bd98-40d1-81cb-8bbfb6f0bb63.aspx</link>
      <pubDate>Fri, 01 Aug 2008 10:10:15 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
The changes from v1.2 to the current one (v2.0) are:&#xD;
&lt;/p&gt;&#xD;
        &lt;ul&gt;&#xD;
          &lt;li&gt;&#xD;
Now using NHibernate 2.0.0 CR1.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Fixed a bug that caused the provider to look for the configuration settings only in&#xD;
the nhibernate config section. If you configured NHibernate using the hibernate-configuration&#xD;
section, it didn't work.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Fixed a bug that prevented hashed passwords to work without supplying a password answer.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Some code refactoring/clean up.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Removed all FXCop warnings.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Changed the mapping generation for the NHCustomMembershipProvider. In NHiberante 2.0.0&#xD;
CR1, it is not possible to create mappings programatically as before, so now a xml&#xD;
document with the mapping is created.&lt;/li&gt;&#xD;
          &lt;li&gt;&#xD;
Fixed a bug in ChangePassword and ResetPassword methods that made the stored password&#xD;
answer useless if the provider was using hashed format with password salt.&lt;/li&gt;&#xD;
        &lt;/ul&gt;&#xD;
        &lt;p&gt;&#xD;
From some questions/emails I've got, it seems that some people aren't using&#xD;
the provider the way it was designed. There is no need to modify the code in the provider&#xD;
to support custom fields for your Users or Roles. I have created a sample that uses&#xD;
all the fields in the membership provider and adds some custom fields to&#xD;
show how the provider should be used. The sample also uses the CreateUserExWizard&#xD;
control in order to create an user.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As always, feedback is welcome. It has been tested only in SQL Server 2005. Let me&#xD;
know if you try it in other databases. &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The binaries and source code can be downloaded &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,3b6ccb3f-2f2a-4dcb-a414-605371a00618.aspx"&gt;here&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.manuelabadia.com/blog/aggbug.ashx?id=a93878c1-bd98-40d1-81cb-8bbfb6f0bb63"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=1akB-Iq49iM:N9KGOP2n4dU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=1akB-Iq49iM:N9KGOP2n4dU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=1akB-Iq49iM:N9KGOP2n4dU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=1akB-Iq49iM:N9KGOP2n4dU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=1akB-Iq49iM:N9KGOP2n4dU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=1akB-Iq49iM:N9KGOP2n4dU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=1akB-Iq49iM:N9KGOP2n4dU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.manuelabadia.com/blog/CommentView,guid,a93878c1-bd98-40d1-81cb-8bbfb6f0bb63.aspx</comments>
      <category>ASP.NET;NHibernate</category>
    </item>
    <item>
      <trackback:ping>http://www.manuelabadia.com/blog/Trackback.aspx?guid=51ac1b35-5246-4e8c-9ee6-41334480a54e</trackback:ping>
      <pingback:server>http://www.manuelabadia.com/blog/pingback.aspx</pingback:server>
      <pingback:target>http://www.manuelabadia.com/blog/PermaLink,guid,51ac1b35-5246-4e8c-9ee6-41334480a54e.aspx</pingback:target>
      <dc:creator>Your DisplayName here!</dc:creator>
      <wfw:comment>http://www.manuelabadia.com/blog/CommentView,guid,51ac1b35-5246-4e8c-9ee6-41334480a54e.aspx</wfw:comment>
      <wfw:commentRss>http://www.manuelabadia.com/blog/SyndicationService.asmx/GetEntryCommentsRss?guid=51ac1b35-5246-4e8c-9ee6-41334480a54e</wfw:commentRss>
      <slash:comments>32</slash:comments>
      
      <title>World Rally emulation completed</title>
      <guid isPermaLink="false">http://www.manuelabadia.com/blog/PermaLink,guid,51ac1b35-5246-4e8c-9ee6-41334480a54e.aspx</guid>
      <link>http://www.manuelabadia.com/blog/PermaLink,guid,51ac1b35-5246-4e8c-9ee6-41334480a54e.aspx</link>
      <pubDate>Mon, 12 May 2008 09:13:01 GMT</pubDate>
      <description>&lt;body xmlns="http://www.w3.org/1999/xhtml"&gt;&#xD;
        &lt;p&gt;&#xD;
This post is first in English and then in Spanish&lt;br&gt;&#xD;
Esta noticia está primero en inglés y luego en español&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
World Rally emulation is complete. I implemented priorities (that were trickier than&#xD;
I thought), shadows/highlights and a few missing bits in the video hardware. Here&#xD;
are some screenshots of the finished driver:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic1.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic5.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic3.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic2.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic4.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic7.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic6.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The game is fully playable from beginning to end without any problem as far as I can&#xD;
tell. I thought there was a bug in the video hardware emulation somewhere when I saw&#xD;
this:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/gfx_problem1.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
So I plugged my PCB and compared it to the driver:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/pcb_pic1.jpg" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
The problem is also in the original arcade game. Because of the way an arcade monitor&#xD;
works, the problem is nearly unnoticeable in the original game. I also checked if&#xD;
the original PCB had the same “shadow effect” for the tiles:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/gfx_problem2.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
As you can see, the hardware works that way:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/pcb_pic2.jpg" border="0"&gt;&lt;/img&gt;&#xD;
          &lt;br&gt;&#xD;
 &lt;br&gt;&#xD;
Something curious about the protection... Javier told ElSemi that the protection of&#xD;
this game took 8 months of work, so imagine how complicated it was… even the dallas&#xD;
has some code that performs some pseudorandom dummy accesses to the shared RAM to&#xD;
make black box attacks even more difficult.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
To clarify a question about the other protected games, having the World Rally dallas&#xD;
code does not help to emulate the protection of them.  As MAME now has a DS5002FP&#xD;
core and the other games are almost fully emulated, if we get the dallas code for&#xD;
a game, it will be playable quickly.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Finally, I want to thank to all the people that made this possible. It was cool to&#xD;
be part of this. It has brought me some good memories and healed my wounds with Gaelco.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Update&lt;/strong&gt;: &lt;a href="http://www.gaelco.com"&gt;Gaelco&lt;/a&gt; made public&#xD;
the ROMs for World Rally. You can get them from &lt;a href="http://www.gaelco.com"&gt;their&#xD;
web page&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
For reference here are all the posts about World Rally emulation:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,c20ef5fd-9018-4b83-bba6-63ce3edb5ba5.aspx"&gt;Part&#xD;
1&lt;/a&gt;&#xD;
          &lt;br&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,6aff4d5b-3e22-4a5d-af35-22dc8293e2f9.aspx"&gt;Part&#xD;
2&lt;/a&gt;&#xD;
          &lt;br&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,c7e7ab2e-fea4-4642-a9b7-e43a063662f1.aspx"&gt;Part&#xD;
3&lt;/a&gt;&#xD;
          &lt;br&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,51ac1b35-5246-4e8c-9ee6-41334480a54e.aspx"&gt;Part&#xD;
4&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;hr&gt;&lt;/hr&gt;&#xD;
          &lt;br&gt;&#xD;
La emulación del World Rally está completada. He implementado las prioridades (que&#xD;
han sido más difíciles de lo que pensaba), los focos y sombras, y algún detalle que&#xD;
faltaba del hardware gráfico. A continuación se muestran unas pantallas del driver: &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic1.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic5.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic3.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic2.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic4.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
 &#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic7.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/wrpic6.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Es completamente  jugable sin que haya podido observar ningún problema. Pensé&#xD;
que había algún fallo en la emulación del hardware gráfico cuando vi esto:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/gfx_problem1.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Así que enchufé mi placa y la comparé al driver:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/pcb_pic1.jpg" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Como se observa, el problema también está presente en el juego original. Debido a&#xD;
la forma en la que funciona un monitor de recreativa, el pequeño fallo gráfico es&#xD;
prácticamente inapreciable en el juego original. También comprobé si el juego original&#xD;
hacía el mismo “efecto de sombra” de los puentes:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/gfx_problem2.png" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Como se puede apreciar, el hardware funciona de esa manera:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;img src="http://www.manuelabadia.com/blog/content/binary/pcb_pic2.jpg" border="0"&gt;&lt;/img&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Algo curioso sobre la protección… Javier le dijo a ElSemi que la desarrollar protección&#xD;
del juego llevó 8 meses de trabajo. Inmaginad cómo de complicada es la protección…&#xD;
Incluso el dallas tiene código para realizar accesos pseudoaleatorios a la memoria&#xD;
compartido con el único motivo de hacer que los ataques de tipo caja negra sean incluso&#xD;
más difíciles.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Sobre la pregunta de si tener el código del dallas para el World Rally sirve para&#xD;
emular la protección de los otros juegos, la respuesta es que no. Se necesita el código&#xD;
de cada uno para hacerlo funcionar. Como ahora el MAME ya dispone de un emulador de&#xD;
DS5002FP y los juegos de Gaelco protegidos están ya emulados completamente, una vez&#xD;
que obtengamos el código del dallas para un juego, será jugable rápidamente.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
Por último, me gustaría darle las gracias a toda la gente que ha hecho esto posible.&#xD;
Ha sido muy interesante poder formar parte de esto. Me ha traído muy gratos recuerdos&#xD;
y ha cerrado viejas heridas con Gaelco.&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;strong&gt;Actualización&lt;/strong&gt;: &lt;a href="http://www.gaelco.com"&gt;Gaelco&lt;/a&gt; ha&#xD;
hecho públicas las ROMs del World Rally. Puedes obtenerlas desde &lt;a href="http://www.gaelco.com"&gt;su&#xD;
página web&lt;/a&gt;&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
A modo de referencia, aquí están todas las noticias sobre la emulación del World Rally:&#xD;
&lt;/p&gt;&#xD;
        &lt;p&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,c20ef5fd-9018-4b83-bba6-63ce3edb5ba5.aspx"&gt;Parte&#xD;
1&lt;/a&gt;&#xD;
          &lt;br&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,6aff4d5b-3e22-4a5d-af35-22dc8293e2f9.aspx"&gt;Parte&#xD;
2&lt;/a&gt;&#xD;
          &lt;br&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,c7e7ab2e-fea4-4642-a9b7-e43a063662f1.aspx"&gt;Parte&#xD;
3&lt;/a&gt;&#xD;
          &lt;br&gt;&#xD;
          &lt;a href="http://www.manuelabadia.com/blog/PermaLink,guid,51ac1b35-5246-4e8c-9ee6-41334480a54e.aspx"&gt;Parte&#xD;
4&lt;/a&gt;&#xD;
        &lt;/p&gt;&#xD;
        &lt;img width="0" height="0" src="http://www.manuelabadia.com/blog/aggbug.ashx?id=51ac1b35-5246-4e8c-9ee6-41334480a54e"&gt;&lt;/img&gt;&#xD;
      &lt;/body&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=8fJ0zWBK--0:T8vP1gtkXTc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=8fJ0zWBK--0:T8vP1gtkXTc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=8fJ0zWBK--0:T8vP1gtkXTc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=8fJ0zWBK--0:T8vP1gtkXTc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=8fJ0zWBK--0:T8vP1gtkXTc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?i=8fJ0zWBK--0:T8vP1gtkXTc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ManuelAbadia?a=8fJ0zWBK--0:T8vP1gtkXTc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ManuelAbadia?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <comments>http://www.manuelabadia.com/blog/CommentView,guid,51ac1b35-5246-4e8c-9ee6-41334480a54e.aspx</comments>
      <category>Games;MAME</category>
    </item>
  </channel>
</rss>
