<?xml version="1.0" encoding="utf-8"?>
<feed xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom">
  <title>Jan Blomquist on Programming</title>
  <link rel="alternate" type="text/html" href="http://www.janblomquist.com/blog/" />
  <link rel="self" href="http://www.janblomquist.com/blog/SyndicationService.asmx/GetAtom" />
  <icon>favicon.ico</icon>
  <updated>2009-10-21T07:14:06.8025019-04:00</updated>
  <author>
    <name>Jan Blomquist</name>
  </author>
  <subtitle>Do what you love and love what you do. </subtitle>
  <id>http://www.janblomquist.com/blog/</id>
  <generator uri="http://dasblog.info/" version="2.2.8279.16125">DasBlog</generator>
  <entry>
    <title>The anatomy of the "DRIMR" technology for ASP.NET</title>
    <link rel="alternate" type="text/html" href="http://www.janblomquist.com/blog/2009/09/11/TheAnatomyOfTheDRIMRTechnologyForASPNET.aspx" />
    <id>http://www.janblomquist.com/blog/PermaLink,guid,a1fbf6e3-fd8f-4299-a5c9-bb8ca2107859.aspx</id>
    <published>2009-09-11T05:12:21.358-04:00</published>
    <updated>2009-10-21T07:14:06.8025019-04:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">With the advent of ASP.NET, Microsoft developers
were given superior tools for web application development in the beginning of the
century. Many things has changed since the first betas of Visual Studio, some of us
still remember the <a href="http://www.amazon.com/VB-NET-Programming-Public-Billy-Hollis/dp/1861004915/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1252504166&amp;sr=8-1">first
book</a> available on the topic: 
<br /><br />
Some lessons learned were harder than others after all these years. Here are some
of them of which I've twisted my brain many a times. 
<br /><ul><li>
Internet Explorer doesn't rule the planet anymore. Browsers are now assembled in a
crowded court and even death-sentences are not carried out according to <a href="http://www.bringdownie6.com/">developers
wishes</a><br /></li><li>
ASP.NET wasn't that easy after all. <a href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/03/truly-understanding-viewstate.aspx">Ref1</a> + <a href="http://weblogs.asp.net/infinitiesloop/archive/2006/08/25/TRULY-Understanding-Dynamic-Controls-_2800_Part-1_2900_.aspx">Ref2 </a><br /></li><li>
Ajax is more than washing powder. No, I am not thinking of the <a href="http://english.ajax.nl/">dutch
football team</a> :-)<br /></li></ul>
The first two points were popped off the top of my <a href="http://en.wikipedia.org/wiki/Stack_%28data_structure%29">stack</a>,
but the latter is this blog's <b><a href="http://en.wikipedia.org/wiki/Raison_d%27%C3%AAtre">raison
d'être</a></b> and in particular I will spend the gross portion discussing rendering
strategies for ASP.NET. 
<br /><h2>FULL RENDERING 
<br /></h2>
Full re-rendering has been with us ever since aspx pages saw daylight. Regardless
of POSTs and GETs, the ASPX was always fully sent (from top to bottom) to the client.
Through it's elegant postback model, ASP.NET gave us server side event handlers and
other treats like full <a href="http://en.wikipedia.org/wiki/Object-oriented_programming">OOP</a>, <a href="http://en.wikipedia.org/wiki/Just-in-time_compilation">JIT</a> and
the <a href="http://en.wikipedia.org/wiki/Base_Class_Library">BCL</a> just to name
a few of it's premier citizens. The issue with full re-rendering today is that the
approach does not concern itself at all with the concept of <a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29">ajax</a>.
Users are now adapted to browsing the web more as an interactive applications than
a collection of static pages. People interact via chats, games, auctions and other
applications. Full re-rendering breaks this flow and is certainly not the recipe for
survival in this highly competitive industry. 
<br /><br /><u>Microsoft's response to this challenge was a technology called partial rendering</u><br /><h2>PARTIAL RENDERING == PARTIAL SUCCESS
</h2>
Microsoft has made several efforts to bring ASP.NET back in the leauge of extraordinary
gentlemen, with (unfortunately) only Partial success. A few of the symptoms can be
witnessed in the following observations 
<br /><ul><li>
Microsoft has abandoned one of their <a href="http://en.wikipedia.org/wiki/Unique_selling_proposition">USP </a>(Unique
selling proposition) in terms of <a href="http://en.wikipedia.org/wiki/Managed_code">language
independence</a> and bringing various tools together to aid in the development of
JavaScript code. Also the immensly popular JavaScript library: <a href="http://weblogs.asp.net/scottgu/archive/2008/09/28/jquery-and-microsoft.aspx">jQuery
is to be shipped with the upcoming version of Visual Studio.NET 2010</a></li><li>
A substantial amount of <a href="http://www.hanselminutes.com/default.aspx?showID=82">key
developers is in the pursuit of alternatives like Ruby on Rails</a> </li></ul><br />
It's brought to my attention that the UpdatePanel strategy to Ajax on the ASP.NET
platform is by far the most popular approach. Simply wrap up your existing ASP.NET
code into these panels, drop the ScriptManager on the page and configure a few triggers
and your existing ASP.NET app is ajaxified with just a few ingredients. <a href="http://jaf6.files.wordpress.com/2008/12/spagetti2.jpg">What
a wonderful stew! </a><br /><br />
The UpdatePanel brings ease of use, ajax and the ability to build on existing investments
without the need to bring another paradigm into your applications (ref; <a href="http://en.wikipedia.org/wiki/JavaScript">JavaScript</a>). 
<br /><br /><h3 style="vertical-align: text-top;"><img src="content/binary/key_point.png" border="0" /> There
are however a few side-effects of using the UpdatePanel that is of great importance
to be aware of. I will lay them out for you here: 
<br /></h3><ol><li>
The UpdatePanel is still a re-rendering strategy, the only difference is that it restricts
the area of re-rendering and gives you partial rendering. 
</li><li>
To get a tight and quick response from the server - you still need a lot of UpdatePanels.
In theory, for optimal performance, one needs an UpdatePanel for every server control.
You also need to configure triggers between them and introduce the <a href="http://geekswithblogs.net/influent1/archive/2007/05/16/112544.aspx">ScriptManager </a>on
the page. This will eventually lead to un-maintainable code and the famous "<a href="http://en.wikipedia.org/wiki/Damned_If_You_Do">damned
if you do and damned if you don't.</a>" scenario. 
</li><li>
The Client side HTML nodes is destroyed and replaced by the new nodes. This in itself
doesn't bring any level of interactivity, but actually leads to limitations of it.
Imagine an AutoCompleter/Google Suggest feature built with the UpdatePanel? My thoughts
exactly! 
</li></ol><br /><u>Hence, the need for a new paradigm.</u><br /><h2>Say hello to DRIMR <font size="2">(Dynamic Removals, Inserts, Moves and Replacements)</font><br /></h2>
If the ASP.NET platform is to continue to be superior in it's domain (Active <b>Server </b>Pages)
there's a need for a shift, or rather going back to it's roots with <a href="http://en.wikipedia.org/wiki/Gall%27s_law">simplifcation
in mind</a>. Let's examine the proposal for a new concept called DRIMR. 
<br /><h3 style="vertical-align: text-top;"><img src="content/binary/key_point.png" border="0" /> Key
goals for the DRIMR technology
</h3><ol><li>
Perform partial rendering as <b>seldom </b>as possible, but when required, render
as <b>little </b>as possible.</li><li>
Keep the server side ControlTree <b>synchronized </b>with the Clientside DOM tree
without replacing the DOM structure.</li><li>
Introduce as few new concepts to learn as possible. In the best case, <u>no new concepts
should be learned</u>. All existing ASP.NET knowledge should be reused. 
</li></ol><b>Before we dig into the practicals, let's draw some theory on the blackboard first. </b><br /><br />
Let's imagine that ASP.NET itself took the responsibility of understanding all the
tasks that were assigned to the UpdatePanel/ScriptManager and lifted out that responsibility
from your shoulders. It would be just like when ViewState is marked dirty when changed
after initialization. It happens automatically. Then imagine that each control only
sent it's changes back to the client in the form of <a href="%28http://www.bofh.org.uk/2008/04/07/code-is-data-and-it-always-has-been">code </a><br /><br />
A lot of things can happen to a control over it's lifetime. <u>Here are a few cases</u>:<br /><ol><li>
The control can be added<br /></li><li>
The control can be removed<br /></li><li>
The control can be moved between different parent controls or within it's parent childcontrols
and change it's index<br /></li><li>
The control can be added, but replaces an existing control in the client. (ie: Label
replaces Label, or <a href="http://en.wikipedia.org/wiki/Eye_for_an_Eye_%281996_film%29">Eye
for an Eye</a>) </li><li>
The control stays where it is, but only a few properties change<br /></li></ol>
All of the above scenarios incur a change that would require re-rendering. In partial
rendering, the contents of the UpdatePanel is re-rendered. In the case of a moved
control, often the source and target UpdatePanel is re-rendered leading to a substantial
amount of data being sent over the wire. The data can often be comparable to a full
page rendering. 
<br /><br />
Once again, imagine that all these cases were abstracted away into the controls themselves
so that they would take care of those scenarios and that instead of re-rendering,
instructions were sent to the client about what should be done. That's exactly what
DRIMR is all about. 
<br /><br />
Let's cover a few of these cases and look at it's implications. 
<br /><h3>Control added during ajax request<br /></h3>
The control is added in an asynchronous <a href="http://en.wikipedia.org/wiki/XMLHttpRequest">XHR</a> and
it has never been rendered before. It should then automatically try to inject itself
in the controls on the client. This requires extensive insertion capabilities on the
client and a substantial intelligence from server. From a birds view, it would look
something like this (<a href="http://www.windowsvienna.com/windows-7-m3-paint-m22.html">Paint
in Windows7 rocks!!!</a>) 
<br /><br /><img src="http://www.janblomquist.com/blog/content/binary/Insert.png" border="0" /><br /><br />
This is typical code you would write to insert a new control at a given index from
the server. The control could represent anything, that's not the most important thing
for now. Later we'll look at some concrete implementations. 
<br /><br /><b>DRIMR</b> would serialize something like this to the client. A single line of code
to insert the node directly adjacent to the flagX control. This is refered to as the
dynamic insertion capabilities. 
<br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">Gaia.IA('flagX','&lt;img
id=<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"flagA"</span> src=<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"tn.png"</span> temp_src=<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"tn.png"</span> alt=<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Tn"</span> style=<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"border-width:0px;"</span> /&gt;');</span></pre><ul><li>
Gaia.IA is an abbreviation for Gaia.insertAfter and will insert the control adjacent
to the 'flagX' control. This control doesn't have to be an AjaxControl. The second
parameter is the control html itself. 
</li><li>
Other insertion functions include IT - insertTop and IE -insertEnd</li><li>
Insertion of new nodes involve partial rendering to some degree, but is limited only
to the content of the new control inserted. It's related script object is also initialized
as part of script. 
<br /></li></ul><h3>Control removed during ajax request<br /></h3>
Removal of a control in an XHR callback only requires the server to send instructions
of removal to the client. The only information needed is which ControlID to remove
and the client will remove and destroy the control instance(s). 
<br /><br /><img src="content/binary/Remove.png" border="0" /><br /><br /><br />
This yields huge benefits because no rendering takes place at all and all other controls
are left untouched. This is the dynamic removal part of <b>DRIMR</b>. The serialized
code looks something like this: <span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><br /><br />
Gaia.DR('flagA');</span><br /><ul><li>
Gaia.DR is abbreviation for Gaia.dynamicRemove</li></ul><img src="content/binary/partial-rendering.gif" border="0" /><h3>Control moved during ajax request<br /></h3>
Creating interactive applications and games often include moving controls. It's a
shame that moving a control server side requires re-drawing the contents of the page
when in practice the control is already there - in the browser. 
<br /><br />
A move could have been thought of as a combination of insertion and removal, but this
would require re-rendering the control, when all you want is to have that very same
control situated a different place on the page. Let's illustrate this with the chess
game. Moving the knight from f3 to g1. The pseudo-code in the Dropped event is for
educational purpose only and is codewise non-sensical. 
<br /><br /><img src="content/binary/Move.png" border="0" /><br /><br />
In the case above, DRIMR should physically move the control in the browser. This is
the dynamic move capabilities of DRIMR. This is accomplished with the following instructions: 
<br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">Gaia.IT(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"f3"</span>,<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"white-knight-g1"</span>,1);$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"white-knight-g1"</span>).setID(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"white-knight-f3"</span>);</span></pre>Notice
also the ID change. This is required since the generated ID from the server will change
if it's part of an INamingContainer. If the ID doesn't change, the call to SetID will
not occur. The naming container in the chess game is moved for readability. Click
here to view the chess game online. 
<br /><ul><li>
Gaia.IT is abbreviation for insertTop</li><li>
All the IA, IT, IE functions are used in dynamic moves, but the second parameter is
the source control ID and not the markup to insert.  
<br /></li><li>
The call to .setID updates the ClientID to fully reflect the cumulative ID based on
the <a href="http://msdn.microsoft.com/en-us/library/system.web.ui.inamingcontainer.aspx">INamingContainer </a>on
the server. 
<br /></li></ul><img src="content/binary/partial-rendering.gif" border="0" /><h3>Control replaces another during ajax request<br /></h3>
This case reveals itself quite often. The most obvious example is pagination in the
GridView. When you go from Page1 to Page2, the controls are often the same( not always,
but often). So if the same control is located during a swap based on it's coordinates,
we should effectively be able to reuse that control just by diffing the different
states and updating it. 
<br /><br />
Case: Label replaces a Label. Reuse that Label on the Client. Here's a practical code
example: 
<br /><br /><b>ASPX</b><br /><img src="content/binary/RepeaterBind.png" border="0" /><br /><br /><b>C#</b><br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">protected</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">void</span> zFilter_TextChanged(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">object</span> sender,
EventArgs e)<br />
{<br />
    zRepeater.DataSource <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> _calendarController.CalendarItems;<br />
    zRepeater.DataBind();<br />
}</span></pre><br />
This is a a typical databinding scenario where Labels are used to represent each DataItem.
Let's say the list got filtered during the TextChanged event of a Textbox and went
from 4 items to 2 items. This is the code that would be transmitted to the client:<br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"zRepeater_ctl00_ctl00"</span>).setText(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Fix
Bugs|"</span>);<br />
$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"zRepeater_ctl01_ctl00"</span>).setText(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Fix
Bugs|"</span>);<br />
Gaia.DR(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"zRepeater_ctl02_ctl00"</span>);<br />
Gaia.DR(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"zRepeater_ctl03_ctl00"</span>);Gaia.SU(true);<br /></span></pre>The first two labels were reused and since only the Text property changed
- only the Text property is serialized back to the client. Interesstingly the Labels
not needed anymore are dynamically removed using the Gaia.DR statement. 
<br /><br /><img src="content/binary/partial-rendering.gif" border="0" /><br /><h3>Only Control properties are changed
</h3><img style="float: right;" src="content/binary/NestedPanels.png" border="0" /> Often,
controls are not added, replaced or removed. Sometimes only simple property changes
happen. In this graphic you see 40 nested Panels inside eachother. They are made clickable
and it's background-color is set to a randomly defined color in the click handler.<br /><br />
In C#, that's a simple one liner<br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;"><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">protected</span><span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">void</span> panel_Clicked(<span style="color: Blue; background-color: Transparent; font-family: Courier New; font-size: 11px;">object</span> sender,
EventArgs e)<br />
{<br />
panel.BackColor <span style="color: Red; background-color: Transparent; font-family: Courier New; font-size: 11px;">=</span> WebUtility.GetRandomColor();<br />
}</span></pre>Without a proper way to signalize that change, only partial rendering
would come to the rescue and re-render all the panels again. But with the Update capabilities
in DRIMR, you would only serialize the following change: 
<br /><br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"m_p_zRoot_ctl16"</span>).setBackColor(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"661C3D,255"</span>);<br /></span></pre><img src="content/binary/partial-rendering.gif" border="0" /><h2>Case Study of DRIMR technology: GridView
</h2>
This Case Study demonstrates how DRIMR applies to the ControlSmith. We will examine
it's usage in the GridView for ASP.NET<br /><br /><img src="content/binary/GridView.png" border="0" /><br /><br />
When you databind a GridView - the controls are typically the same at all the same
positions. Based on your ItemTemplates, the structure of the rows, columns and cells
are mostly the same and therefore the controls can be reused in update scenarios.
Let's say you click the Pager to navigate from Page1 to Page2; In the first column
you store the CustomerName and a Label is used for this purpose. DRIMR kicks in and
uses all the techniques described above to insert, remove, reuse and change the controls
in the GridView. 
<br /><br />
Here's a little exerpt from the instructions serialized to the client<br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"m_p_zGridView_ctl07_ctl00"</span>).setCssClass(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"gaiax-gv-cell-first"</span>);<br />
$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"m_p_zGridView_ctl07_ctl01"</span>).setText(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"16"</span>);<br />
$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"m_p_zGridView_ctl07_ctl03"</span>).setText(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Erik
Anderson"</span>);<br />
$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"m_p_zGridView_ctl07_ctl04"</span>).setText(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"Sales
Presentation"</span>);<br />
$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"m_p_zGridView_ctl07_ctl05"</span>).setText(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"9/13/2009
5:23:56 PM"</span>);<br />
$G(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"m_p_zGridView_ctl07_ctl06"</span>).setCssClass(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"gaiax-gv-cell-input
gaiax-gv-cell-last"</span>);</span></pre>As you can see the labels are reused and
their new state is assigned and serialized automatically. 
<br /><br />
If we page to the last page where there's only 1 row, the remaining unused rows are
dynamically removed using the following JavaScript code. 
<br /><pre><span style="color: Black; background-color: Transparent; font-family: Courier New; font-size: 11px;">Gaia.DR(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"grid_ctl03_ctl00"</span>);Gaia.DR(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"grid_ctl03_ctl01"</span>);Gaia.DR(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"grid_ctl03_ctl02"</span>);Gaia.DR(<span style="color: rgb(102, 102, 102); background-color: rgb(228, 228, 228); font-family: Courier New; font-size: 11px;">"grid_ctl03_ctl03"</span>);</span></pre><br /><img src="content/binary/partial-rendering.gif" border="0" /><br /><p></p><h2>Online Examples of DRIMR
</h2><ul><li><a href="http://samples.gaiaware.net/BasicControls/GridView/Overview/">ASP.NET GridView<br /></a></li><li><a href="http://samples.gaiaware.net/Combinations/WebApps/Chess/">Ajax Chess Game</a></li><li><a href="http://samples.gaiaware.net/Combinations/WebApps/DashboardWithWebParts/">WebPart
Dashboard</a></li><li><a href="http://samples.gaiaware.net/Core/StateManagers/Serialization/">Property Changes</a></li></ul><h2>Conclusion
</h2><h3 style="vertical-align: text-top;"><img src="content/binary/key_point.png" border="0" /></h3>
DRIMR embraces the <a href="http://msdn.microsoft.com/en-us/library/zt27tfhy.aspx">ASP.NET
Server Control paradigm</a> and enhances the experience ASP.NET from the server side
perspective. It lifts the burden away from the developer to learn anything about Ajax
or JavaScript at all and still enables the creation of interactive applications and
games like the Chess and Dashboard example above. 
<br /><br />
I truly believe in abstracting away the inner workings of JavaScript, HTML, XHR, Serialization,
Databinding, etc. DRIMR is part of the technology stack built on top of ASP.NET that
enables the creation of advanced applications from the server, where they belong in
the Active Server paradigm. 
<br /><br /><img width="0" height="0" src="http://www.janblomquist.com/blog/aggbug.ashx?id=a1fbf6e3-fd8f-4299-a5c9-bb8ca2107859" /></div>
    </content>
  </entry>
  <entry>
    <title>Blogs about new features in Gaia Ajax 3.5</title>
    <link rel="alternate" type="text/html" href="http://www.janblomquist.com/blog/2009/02/16/BlogsAboutNewFeaturesInGaiaAjax35.aspx" />
    <id>http://www.janblomquist.com/blog/PermaLink,guid,0f0a59a8-10f2-4341-a0a6-500a3b0d74ee.aspx</id>
    <published>2009-02-16T03:05:23.588-05:00</published>
    <updated>2009-02-16T03:06:45.8075744-05:00</updated>
    <category term="Release" label="Release" scheme="http://www.janblomquist.com/blog/CategoryView,category,Release.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">Gaia Ajax 3.5 is to be released shortly.
If you don't know it, Gaia Ajax is an Ajax library for ASP.NET that goes far beyond
other libraries in offering Ajax support and giving developers tools they can use
to build scalable, high performing and easy to maintain solutions.  
<h3><span class="taggedlink"></span><div style="float: right; padding-left: 5px;"><br /><img src="http://www.janblomquist.com/blog/content/binary/hybridcontrols.jpg" border="0" /></div><span class="taggedlink">Smarter Control Collections for HybridControls</span></h3>
Examine the new HybridControl Control Collections. Both Implementation and usage.  
<br /><br /><a href="http://blogs.gaiaware.net/post/Smarter-Control-Collections-for-HybridControls-in-Gaia-Ajax-35.aspx">Click
here to read the blog entry</a><br /><h3><div style="float: right; padding-left: 5px;"><br /></div><span class="taggedlink">FileUpload Control created by the Gaia Ajax Community</span></h3>
Adding FileUpload capabilities to your application might not be too difficult, but
what if you want it Ajaxified? Don't worry. The latest version of Gaia Ajax includes
a FileUpload control donated by Pavol. Read the story below to learn about how you
can embed this into your own application. 
<br /><br /><a href="http://blogs.gaiaware.net/post/Ajax-Multiple-FileUpload-for-ASPNET.aspx">Click
here to read full story</a><br /><h3><span class="taggedlink">Enhanced IGoogle Example<br /></span></h3>
Added support for easily adding your own controls to the dashboard. Read more about
how to leverage the drag&amp;drop facilities of Gaia Ajax 3.5 to put up a customizable
dashboard. 
<br /><br /><a href="http://blogs.gaiaware.net/post/Easily-create-a-dashboard-in-ASPNET.aspx">Click
here to read full story</a><br /><br /><br /><br /><br /><br /><br /><p></p><br /><img width="0" height="0" src="http://www.janblomquist.com/blog/aggbug.ashx?id=0f0a59a8-10f2-4341-a0a6-500a3b0d74ee" /></div>
    </content>
  </entry>
  <entry>
    <title>Gaia Ajax Tutorials</title>
    <link rel="alternate" type="text/html" href="http://www.janblomquist.com/blog/2009/02/05/GaiaAjaxTutorials.aspx" />
    <id>http://www.janblomquist.com/blog/PermaLink,guid,373e2835-cd61-4be1-b99b-5fce65477d35.aspx</id>
    <published>2009-02-05T04:16:24.481-05:00</published>
    <updated>2009-02-05T04:23:36.8878211-05:00</updated>
    <category term="Blogs" label="Blogs" scheme="http://www.janblomquist.com/blog/CategoryView,category,Blogs.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">The last three days I've written different
blogs/tutorials on howto use Gaia Ajax in different scenarios. One of the blog is
more about LINQ, but becomes highly more relevant because of the powerful usage scenarios
you can apply LINQ to Gaia development. 
<br /><br />
Here they are<br /><br /><h3><div style="float: left; padding-right: 5px;"><img src="http://www.janblomquist.com/blog/content/binary/modal_ajax_msgbox.png" border="0" /></div><span class="taggedlink"><br />
Modal Ajax Messagebox for ASP.NET in Gaia</span></h3>
Most applications today utilizes some kind of messagebox to either give feedback to
the user or halt the execution of the application, until the user performs a choice.
Typically Ok, Yes, No or Cancel. Creating such a control for the web can be a
daunting task, but it doesn't have to be. By using Gaia Ajax we can pop out a fairly
feature rich MessageBox in a short amount of time. In this blog I am going to create
the MessageBox and use it in a simple sample. The code will be provided for download
if you find it useful. 
<br /><br /><a href="http://blogs.gaiaware.net/post/Modal-Ajax-Messagebox-for-ASPNET-in-Gaia.aspx">Creating
an ajax popup dialog messagebox in C# fully programmable from the server in Gaia Ajax</a><br /><h3><div style="float: right; padding-left: 5px;"><img src="http://www.janblomquist.com/blog/content/binary/orderedlistbox.png" border="0" /></div><span class="taggedlink">Traversing the ASP.NET Control Tree with LINQ</span></h3>
Using LINQ greatly simplifies Control Tree traversal and manipulation. Use simple
one liners to change properties recursively or perform lookups. This blog also discuss
how to transform controls into entity objects and vice versa. Happy Linq-in!<br /><br /><a href="http://blogs.gaiaware.net/post/Use-LINQ-to-navigate-the-ASPNET-Control-Tree-programmatically.aspx">Using
LINQ to traverse, manipulate and recurse ASP.NET control tree</a><br /><h3><span class="taggedlink">Creating an Ordered Ajax ListControl in C# with Gaia</span></h3>
In this tutorial we demonstrate how to create a reusable Ordered ListControl. We will
also use generics so that it applies to all ListControls like ListBox, DropDownList,
CheckBoxList, RadioButtonList, etc. The control can be used from any .NET managed
language.<br /><br /><a href="http://blogs.gaiaware.net/post/Building-an-Ordered-Ajax-ListControl-in-Gaia-Ajax-using-C.aspx">Howto
create an ajax ordered listbox or any other listcontrol in C# with Gaia Ajax. </a><br /><br /><br /><br /><br /><p></p><br /><br /><img width="0" height="0" src="http://www.janblomquist.com/blog/aggbug.ashx?id=373e2835-cd61-4be1-b99b-5fce65477d35" /></div>
    </content>
  </entry>
  <entry>
    <title>Resharper - The Ultimate Tool for Productive Development in C#</title>
    <link rel="alternate" type="text/html" href="http://www.janblomquist.com/blog/2009/02/04/ResharperTheUltimateToolForProductiveDevelopmentInC.aspx" />
    <id>http://www.janblomquist.com/blog/PermaLink,guid,c2cf459b-7a3a-49f6-8cbf-a24dbe19f929.aspx</id>
    <published>2009-02-04T05:45:05.08-05:00</published>
    <updated>2009-02-04T06:20:20.3479546-05:00</updated>
    <category term="Agile" label="Agile" scheme="http://www.janblomquist.com/blog/CategoryView,category,Agile.aspx" />
    <category term="Refactoring" label="Refactoring" scheme="http://www.janblomquist.com/blog/CategoryView,category,Refactoring.aspx" />
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <img src="http://www.janblomquist.com/blog/content/binary/resharper.png" border="0" />
        <br />
        <br />
I've got a confession to make. I have totally fallen in love with <a href="http://www.jetbrains.com/resharper/">Resharper</a>.
Before you continue reading I just want you to know that I am not on commission for
these guys, but I find the tool to be so invaluable to my productivity that I wouldn't
want to develop without it. Resharper is a refactoring plugin for Visual Studio.NET
that enhances the programming experience in the IDE. It empowers navigation, analysis,
refactoring, assistance, cleanup, code generation and unit testing. 
<br /><br />
I recently gave a short speech / demo about the usage of Resharper at the local user
group here in Norway. If you happen to live in Grenland you can read more about these
gatherings <a href="http://www.iktgrenland.no/">here</a><br />
Since it's so hard to get paid for doing post development refactorings, refactoring
should be a continuous task that you do while programming. It increases the robustness
of the application drastically and makes future changes easier to incorporate. 
<br /><br />
The easiest feature to get started with is the Full Cleanup <b>(CTRL-E - CTRL-C)</b>.
It will automatically fix the most common mistakes in a C# file. 
<br /><br /><img src="http://www.janblomquist.com/blog/content/binary/resharper_code_cleanup.png" border="0" /><br /><br /><br />
One of the most useful aspects of ReSharper is the integrated Unit Testing parts.
Automatically run all Unit Tests within the IDE simply by attaching a shortcut to
the Unit Testing Explorer Window and run your unit tests. 
<br /><br /><img src="http://www.janblomquist.com/blog/content/binary/resharper_unit_testing_explorer.png" border="0" /><br /><br /><br />
Here's a short list of the most commonly used refactorings. 
<br /><h3>NAVIGATION HISTORY
</h3><ul><li>
View File Structure <b>(CTRL-ALT-F)</b></li><li>
View Type Hierarchy <b>(CTRL-ALT-H)</b></li><li>
Go To <b>(CTRL-T, CTRL-SHIFT-T, ALT-\)</b></li><li>
Todo-Items <b>(CTRL-ALT-D)</b></li><li>
Unit Testing <b>(CTRL-ALT-U)</b></li><li>
Find Usages <b>(SHIFT-F12)</b></li></ul><h3>CODE REFACTORING
</h3><ul><li>
- Refactor           <b> CTRL-SHIFT-R</b></li><ul><li>
Rename            
<br /></li><li>
Change signature</li><li>
Convert abstract class to interface</li><li>
Convert method to property</li><li>
Copy type</li><li>
Encapsulate field<br /></li><li>
Extract class from parameters</li><li>
Extract interface, method, superclass</li><li>
Inline variable</li><li>
Make method static/non-static</li><li>
Safe delete</li></ul></ul><h3>CODING ASSISTANCE
</h3><ul><li>
Symbol completion<b> (CTRL-SPACE)</b></li><li>
Smart completion <b>(CTRL-SHIFT-SPACE)</b></li><li>
Import symbol completion <b>(CTRL-ALT-SPACE)</b></li><li>
Context actions <b>(ALT-ENTER)</b></li><li>
Matching delimiters        
</li><li>
Moving code elements <b>(CTRL-SHIFT-ALT (up/down-left-right))</b></li><li>
Surround with regions</li><li>
Suggest namespace import directives</li></ul><h3>CODE ANALYSIS
</h3><ul><li>
Code highlightning</li><li>
Marker bar and status indicator</li><li>
Solution wide analysis</li><li>
External Annotations</li><li>
Quick Fixes</li><li>
Navigation between errors/warnings/suggestions    SHIFT-ALT (pg-up/pg-down)</li><li>
Value analysis (null, bool)</li><li>
String.format analysis</li></ul><h3>CODE CLEANUP<br /></h3><ul><li>
- Format/Fix File <b>(CTRL-E, CTL-C)</b></li><li>
- Cleanup profiles</li></ul><h3>CODE GENERATION
</h3><ul><li>
Constructor</li><li>
Properties</li><li>
Read-only properties</li><li>
Impl. Interface member</li><li>
Override inherited member</li><li>
Equality members</li><li>
Formatting members</li></ul><h3>Unit Testing
</h3>
- Unit Test Explorer CTRL-ALT-U<br />
- Advanced Functionality (requires Gallio plugin) 
<br />
- Support for MSTest, MBUnit, NUnit, NBehave<br /><br /><i>Don't delay any further. Get ReSharper today! </i><br /><br /><img width="0" height="0" src="http://www.janblomquist.com/blog/aggbug.ashx?id=c2cf459b-7a3a-49f6-8cbf-a24dbe19f929" /></div>
    </content>
  </entry>
</feed>