<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>AJAX</title><link>http://blogs.interknowlogy.com/joelrumerman/category/80.aspx</link><description>AJAX</description><dc:language>en-US</dc:language><generator>.Text Version 0.95.2004.111</generator><item><dc:creator>Joel Rumerman</dc:creator><title>JS Intellisense in Orcas</title><link>http://blogs.interknowlogy.com/joelrumerman/archive/2007/03/03/12132.aspx</link><pubDate>Sat, 03 Mar 2007 17:43:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/joelrumerman/archive/2007/03/03/12132.aspx</guid><description>&lt;p&gt;It&amp;#8217;s finally here!!&lt;/p&gt;
&lt;p&gt;JavaScript intellisense is available in the March 2007 CTP of Orcas (the next Visual Studio). It works well with plain old JavaScript, but it really shines with ASP.NET AJAX. &lt;/p&gt;
&lt;p&gt;Jeff King does a good job of documenting the new capabilities in this &lt;a href="http://blogs.msdn.com/webdevtools/archive/2007/03/02/jscript-intellisense-in-orcas.aspx"&gt;blog entry&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For us ASP.NET Server Control developers that utilize client capabilities, this is a huge boon for us. When was the last time JS intellisense was updated?? Anybody? I have no idea&amp;#8230; I don&amp;#8217;t think it&amp;#8217;s changed since the first release of Visual Studio. Having to program ASP.NET AJAX client runtimes with intellisense &amp;#8230; AWESOME!!!&lt;/p&gt;
&lt;p&gt;Also, I mentioned an excellent article in my webcast that describes the prototype/closure model. I finally found it&amp;#8230; &lt;a href="http://www.jibbering.com/faq/faq_notes/closures.html"&gt;here it is&lt;/a&gt;. &lt;/p&gt;
&lt;p&gt;IMHO, it&amp;#8217;s the single best article that describes closures available.&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/joelrumerman/aggbug/12132.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Rumerman</dc:creator><title>ASP.NET AJAX Client Component Development WebCast</title><link>http://blogs.interknowlogy.com/joelrumerman/archive/2007/03/01/12120.aspx</link><pubDate>Thu, 01 Mar 2007 12:08:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/joelrumerman/archive/2007/03/01/12120.aspx</guid><description>&lt;p&gt;Hello Everyone,&lt;/p&gt;
&lt;p&gt;Thanks so much for attending today&amp;#8217;s webcast! We had 150+ attend and this is just a testament to how important and interesting a subject MS ASP.NET AJAX is. &lt;/p&gt;
&lt;p&gt;As promised, here is the source code from today&amp;#8217;s webcast. This is free source code, no limits on modifications, re-use, redeployment to clients, etc. I don&amp;#8217;t even have my name in it yet. &lt;/p&gt;
&lt;p&gt;I will add however, that the component that is supplied in this source code only works in certain situations. Try sticking a button you want to disable within an UpdatePanel and see what happens. It&amp;#8217;ll work the first time, but in subsequent partial postbacks. There&amp;#8217;s another, longer version of the source code that I&amp;#8217;m working on that is more fully-baked that can be reused successfully across web applications and in different scenarios.&lt;/p&gt;
&lt;p&gt;Again, thanks for joining me today on the webcast. I hope you enjoyed it and learned something interesting! Stay tuned for more webcasts regarding ASP.NET AJAX custom development. I think I&amp;#8217;m going to put a couple of more in the pipeline.&lt;/p&gt;
&lt;p&gt;&lt;a title="Download Source" HREF="/downloads/joelrumerman/MSDN%20Source%20Code.zip"&gt;Download Source&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/joelrumerman/aggbug/12120.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Rumerman</dc:creator><title>February SD .NET Developers Group Talk on ASP.NET AJAX Component Creation</title><link>http://blogs.interknowlogy.com/joelrumerman/archive/2007/02/07/11291.aspx</link><pubDate>Wed, 07 Feb 2007 16:01:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/joelrumerman/archive/2007/02/07/11291.aspx</guid><description>&lt;p&gt;Thanks to everyone that attended the meeting and heard my talk about ASP.NET AJAX Component Development. We had a great time hosting and I hope it sparked some interest in ASP.NET AJAX Component development and that you were able to learn something new.&lt;/p&gt;
&lt;p&gt;Here are the slides and code from my presentation. I&amp;#8217;m not attaching the postback disabler control at the moment (the last thing I demoed at the meeting) as it&amp;#8217;s not ready to go yet and I think I&amp;#8217;ll blog more in-depth about it in the next few weeks.&lt;/p&gt;
&lt;p&gt;Happy coding, and thanks for attending!!&lt;/p&gt;
&lt;p&gt;&lt;A href="http://blogs.interknowlogy.com/downloads/joelrumerman/ASP.NET%20AJAX%20Component%20Development.ppt"&gt;File Attachment: ASP.NET AJAX Component Development.ppt (745 KB)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;A href="http://blogs.interknowlogy.com/downloads/joelrumerman/DemoAJAXWebsite.zip"&gt;File Attachment: DemoAJAXWebsite.zip (22 KB)&lt;/a&gt;&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/joelrumerman/aggbug/11291.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Rumerman</dc:creator><title>Web Development Helper Release</title><link>http://blogs.interknowlogy.com/joelrumerman/archive/2006/11/14/8465.aspx</link><pubDate>Tue, 14 Nov 2006 11:23:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/joelrumerman/archive/2006/11/14/8465.aspx</guid><description>&lt;p&gt;Nikhil has just released a new version of his irreplacable Web Development Helper tool. If you&amp;#8217;ve been coding in ASP.NET AJAX (Atlas) or in another AJAX way that submits XMLHttp requests and haven't been using this tool you've been missing out on a great tool that really helps with debugging and troubleshooting asynchrounous requests. &lt;/p&gt;
&lt;p&gt;He&amp;#8217;s added a bunch of new features to check out including: JSON viewers, a new viewer for partial rendering scenarios (focusing on the ASP.NET AJAX UpdatePanel), and an installer that solves some of the earlier headaches and that is Vista compliant.&lt;/p&gt;
&lt;p&gt;Check out his blog post about the release &lt;a href="http://www.nikhilk.net/Entry.aspx?id=144" target="_blank"&gt;here&lt;/a&gt;. And download it from his project page &lt;a href="http://projects.nikhilk.net/Projects/WebDevHelper.aspx" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/joelrumerman/aggbug/8465.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Rumerman</dc:creator><title>The UserContext Property of Atlas Web Service Alternative Syntax</title><link>http://blogs.interknowlogy.com/joelrumerman/archive/2006/09/22/5126.aspx</link><pubDate>Fri, 22 Sep 2006 10:58:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/joelrumerman/archive/2006/09/22/5126.aspx</guid><description>Atlas enabled web services are fantastic. They provide a rich, wrapped capability that abstracts a lot of the nitty gritty xmlHttp details away from the programmer. &lt;br /&gt;&lt;br /&gt;The normal pattern of using Atlas Web Services is a static method call that contains a callBack delegate. Once the method is complete, the callback function is automatically executed. For the most part, the code looks like the following: 
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;pre&gt; &lt;span style="FONT-SIZE: 12pt; COLOR: #009933"&gt;   function startWebService() {
        AtlasWebService.Geography.GetCities (CountryId, onCallback, onTimeout);
    }
    
    function onCallBack (results) {
        // do something with the results.
    }
    
    function onTimeout (results) { 
        alert (&amp;#8220;call Timed out&amp;#8221;); 
    } 
&lt;/span&gt;    
&lt;/pre&gt;&lt;/blockquote&gt;Here I'm executing the GetCities web service method passing in the CountryId as the parameter and registering the onCallback method as the onMethodComplete handler and the onTimeout method as the onMethodTimeout handler.&lt;br /&gt;&lt;br /&gt;For simple situations this works great, but in a project a while back we needed to pass some context from the caller (startWebService) to the callback (onCallBack). Using the version of the web service calling pattern that I've demonstrated above, this isn&amp;#8217;t possible. A thought we had to solve this problem was to wrap the function calls inside of a closure and use private members of the closure to hold state. Something like this: 
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;pre&gt;  &lt;span style="FONT-SIZE: 12pt; COLOR: #009933"&gt;  myClass = function () {
        _currCountryId= '';
        this.startWebService = function (CountryId) {
            _currCountryId= CountryId
            AtlasWebService.Geography.GetCities(_currCountryId, onCallback, onTimeout);
        }
        
        function onCallback (results) {
            alert (_currCountryId);
            // handle the results as needed.
        }
    }
&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;While this looks like it might work from initial glance (besides the race condition that might be present if more than one call to startWebService occurred before the first one completed), we found that _currCountryId wouldn&amp;#8217;t be available to the onCallback function. Without jumping into too much JavaScript, the onCallback call is private and therefore unable to access the closure&amp;#8217;s member fields (I think that&amp;#8217;s the reason at least). Changing the onCallback method to &amp;#8220;this.onCallback = function (results)&amp;#8221; didn&amp;#8217;t work either. &lt;/p&gt;
&lt;p&gt;It turns out we were thinking too hard and not reading enough documentation. Atlas&amp;#8217; web service pattern provides a pass-through capability out of the box by using the alternative syntax and the userContext property. The Atlas documentation&amp;#8217;s alternative syntax can be &lt;a title="Alternative Atlas Web Service Syntax" href="http://atlas.asp.net/docs/atlas/doc/services/consuming.aspx" target="_blank"&gt;found here&lt;/a&gt; and the example reads:&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;pre&gt;  &lt;span style="FONT-SIZE: 12pt; COLOR: #009933"&gt;  requestSimpleService = Quickstart.Samples.SimpleService.EchoString( 
        document.getElementById('inputName').value ,  // First webservice parameter     
        secondParameter,                             // Second webservice parameter 
        &lt;/span&gt;&lt;span style="COLOR: #009933"&gt;&lt;b&gt;{ 
	  onMethodComplete:OnComplete, 
	  onMethodTimeout:OnTimeout, 
	  onMethodError:OnError,
         onMethodAborted:OnAborted, 
	  userContext: "OnbuttonGo_click", 
	  timeoutInterval: 10000
	} &lt;/b&gt;
    );&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The blurb below it reads: &amp;#8220;The &lt;code&gt;userContext&lt;/code&gt; parameter can contain any value (string, number, array, dictionary, or object) and is used to pass contextual information that can be retrieved inside of handlers for errors or time-outs.&amp;#8221;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;In this example they are passing &amp;#8220;OnbuttonGo_click&amp;#8221; as the user context. They state the &amp;#8220;contextual information that can be retrieved inside of handlers for errors or time-outs,&amp;#8221; but it can also be used in the normal callback handler and anything that can be successfully serialized into JSON can be passed.&lt;/p&gt;
&lt;p dir="ltr"&gt;Let&amp;#8217;s take a look at our example using the alternative syntax.&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;pre&gt;    &lt;span style="FONT-SIZE: 12pt; COLOR: #009933"&gt;function startWebService(CountryId) {
        AtlasWebService.Geography.GetCities (CountryId,
            {
                onMethodComplete: onCallBack,
                onMethodTimeout: onTimeout,
                &lt;strong&gt;userContext:CountryId&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: #009933"&gt;            }&lt;/span&gt;&lt;span style="FONT-SIZE: 12pt; COLOR: #009933"&gt;
        );
    }
    
    function onCallBack (results, response, userContext) {
        alert (userContext); // will popup the countryId of before.
    }
    
    function onTimeout (results, response, userContext) {
        alert (&amp;#8220;call Timed out for: &amp;#8221; + userContext);
    }
&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p dir="ltr" style="MARGIN-RIGHT: 0px"&gt;Now, when the web service method returns, the onCallBack function will have both the results as well as the userContext I assigned to the method call in startWebService method. &lt;/p&gt;
&lt;p dir="ltr" style="MARGIN-RIGHT: 0px"&gt;A couple of things to note: &lt;/p&gt;
&lt;ol dir="ltr"&gt;
&lt;li&gt;
&lt;div style="MARGIN-RIGHT: 0px"&gt;I didn&amp;#8217;t include the full alternative call syntax. Since it&amp;#8217;s a named parameterized list of properties, it isn&amp;#8217;t required that all of them be included. &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;div style="MARGIN-RIGHT: 0px"&gt;The onCallBack method signature now has 3 parameters. Results, response, and userContext.&lt;br /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;By using the userContext property of the alternative syntax I can pass extra data from my caller to my callback. This is pretty darn helpful.&lt;br /&gt;&lt;br /&gt;Happy Coding, Joel&lt;img src ="http://blogs.interknowlogy.com/joelrumerman/aggbug/5126.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Rumerman</dc:creator><title>Atlas - June CTP</title><link>http://blogs.interknowlogy.com/joelrumerman/archive/2006/07/01/3074.aspx</link><pubDate>Sat, 01 Jul 2006 12:24:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/joelrumerman/archive/2006/07/01/3074.aspx</guid><description>&lt;p&gt;Microsoft has released the &lt;a href="http://atlas.asp.net/default.aspx?tabid=47&amp;subtabid=471" target="_blank"&gt;June CTP of Atlas&lt;/a&gt;. You can download it &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=81BF1390-7894-4FF7-B591-1006BD770BC0&amp;displaylang=en" target="_blank"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Nikhilk has posted a &lt;a title="Nikhilk's Blog Entry" href="http://www.nikhilk.net/Entry.aspx?id=134" target="_blank"&gt;blog entry&lt;/a&gt; describing the core new feature of the CTP; Dynamic UpdatePanels. This is by far the biggest new feature of the CTP (and the last 6 months) and provides a completely new pattern of development for server controls and websites in general that want to take advantage of partial postbacks. I&amp;#8217;m totally stoked about this new feature as I&amp;#8217;m sure all other Atlas developers are, and want to thank Eilon and the rest of the Atlas team for listening to the early adopters cries and responding. I&amp;#8217;m sure there are going to be pitfalls and areas where the new Dynamic UpdatePanel still doesn&amp;#8217;t do exactly what I need it to do, but it&amp;#8217;s a step in the right direction. I&amp;#8217;ll play around with it in the next few weeks and post an entry or two sharing any insights I glean. I just wish that we weren&amp;#8217;t so far along in our real Atlas project that taking advantage of it at this point is probably going to cost too much.&lt;/p&gt;
&lt;p&gt;Other than the Dynamic UpdatePanels, one feature that I&amp;#8217;m really going to like is the ability to see the generated JS code for a service proxy within the page that contains the service proxy. This has been a problem for us as we tried to debug the web services contained within the ScriptManager and I&amp;#8217;m excited to have this new ability.&lt;/p&gt;
&lt;p&gt;One thing I&amp;#8217;m a little disappointed in is that there is no new &lt;a href="http://atlas.asp.net/docs/Default.aspx" target="_blank"&gt;documentation&lt;/a&gt; in the docs section of the Atlas site. Just from reading Nikhilk&amp;#8217;s blog entry there seems to be a lot of new server side classes that we&amp;#8217;ll need to understand in order to take advantage of the new features. I&amp;#8217;m sure that some client side code has changed too. I&amp;#8217;m not too sure if MSFT plans on updating the docs for this CTP, but it sure would be nice.&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/joelrumerman/aggbug/3074.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Rumerman</dc:creator><title>Emitting JavaScript to run on Startup in an Atlas Environment</title><link>http://blogs.interknowlogy.com/joelrumerman/archive/2006/06/20/3021.aspx</link><pubDate>Tue, 20 Jun 2006 16:40:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/joelrumerman/archive/2006/06/20/3021.aspx</guid><description>&lt;p&gt;I&amp;#8217;ve been working with Atlas since the December CTP and in the past few weeks I&amp;#8217;ve grown to really appreciate the way that it formalizes JavaScript programming and the framework it provides for extension. Creating client side behavior for server side controls is repeatable, flexible, and just an overall better experience.&lt;/p&gt;
&lt;p&gt;However, there is one particular problem that is currently drawing my ire and it relates to how Atlas dependent JavaScript needs to be emitted to the client so that it executes correctly on startup, both from a normal page load point of view and a partial postback point of view. &lt;/p&gt;
&lt;p&gt;In a non-Atlas environment I use the Page.ClientScriptManager.RegisterStartupScript function to register any startup JavaScript. However, if I were to register some JavaScript code that relies upon Atlas, for instance &lt;font color="#0000ff"&gt;var myLabel = new Sys.UI.Label($(&amp;#8216;ctrl1_lblName&amp;#8217;));&lt;/font&gt;, using the normal RegisterStartupScript functionality, the browser would throw a JavaScript error as it doesn&amp;#8217;t know what Sys.UI.Label is and it is unable to create a new object of that type. This error makes sense as there is no guarantee that the Atlas JavaScript files will be loaded by the time your startup code is executed as your startup JavaScript code is executed immediately after it is parsed by the browser. Having said that, Atlas provides a way to tie into its Application Load event, which is sort-of the equivalent of the body onload event, but occurs once all of the Atlas JavaScript files have been loaded and the Atlas runtime has been started. The way to do this is wrap your startup code in a function and then register that function as a delegate of the Application Load event. Here&amp;#8217;s a code example.&lt;/p&gt;
&lt;p&gt;Normal startup code &amp;#8230;&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;font color="#0000ff"&gt;var myLabel = new Sys.UI.Label ($(&amp;#8216;ctrl1_lblName&amp;#8217;));&lt;br /&gt;myLabel.initialize();&lt;/font&gt;&lt;/blockquote&gt;
&lt;p&gt;Startup code wrapped in a function and registered with the Application Load event.&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;font color="#0000ff"&gt;function myStartupFunction () {&lt;/font&gt; 
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;&lt;font color="#0000ff"&gt;var myLabel = new Sys.UI.Label ($(&amp;#8216;ctrl1_lblName&amp;#8217;));&lt;br /&gt;myLabel.initialize();&lt;/font&gt;&lt;/blockquote&gt;&lt;font color="#0000ff"&gt; }&lt;/font&gt; &lt;br /&gt;&lt;font color="#0000ff"&gt;Sys.Application.load.add (myStartupFunction); // notice how myStartupFunction doesn&amp;#8217;t have parentheses; it&amp;#8217;s a delegate (function pointer).&lt;/font&gt;&lt;/blockquote&gt;
&lt;p dir="ltr"&gt;This above code would be registered using the RegisterStartupScript method. Now, when the page first loads and Atlas&amp;#8217; runtime begins, myStartupFunction is part of the load multicast event and is executed in the order it was added to the event. This process can be repeated again and again as necessary for any startup code that relies upon Atlas.&lt;/p&gt;
&lt;p dir="ltr"&gt;This pattern works for JavaScript that is loaded on the initial page load or on a full page postback, but there exists a problem when using this pattern with UpdatePanels and performing a partial postback. The functionality of an UpdatePanel provides a way to render a section of a page without the user thinking a full postback is occurring. If a control or a page emits the JavaScript above and the developer wishes to have the JavaScript execute even on a partial postback page load, the above pattern won&amp;#8217;t work because the Sys.Application.load event only fires the &lt;strong&gt;first &lt;/strong&gt;time the page is loaded. It is not fired on subsequent partial loads. Currently (as of the April CTP), there is no event that fires as a load event that encompasses both the initial loading and a partial postback load. However, there is a work around and so far it is has proven reliable.&lt;/p&gt;
&lt;p dir="ltr"&gt;The work around relies upon the server code determining if it is partial rendering mode or not. Partial rendering mode can be determined by examining a property on the ScriptManager control, &lt;strong&gt;IsInPartialRenderingMode&lt;/strong&gt;, that denotes whether the page got to the server through a partial postback, through a full postback, or through an initial page load. If it the server code is executing due to a partial postback, IsInPartialRenderingMode will be set to true, otherwise it will be set to false. If IsInPartialRenderingMode is set to false then the above code where we tie into the Sys.Application.load event is the route we want our code to take. If IsInPartialRenderingMode is set to true, we want to follow a different, very simple pattern of just registering the function as normal startup JavaScript. Here&amp;#8217;s a code example. &lt;/p&gt;
&lt;p dir="ltr"&gt;// in some server side method like OnPreRender&lt;/p&gt;
&lt;p dir="ltr"&gt;&amp;#8230;&lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;
&lt;p dir="ltr"&gt;&lt;font color="#0000ff"&gt;String javaScriptFunction = @&amp;#8220; 
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;function myStartupFunction () { 
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;var myLabel = new Sys.UI.Label ($(&amp;#8216;ctrl1_lblName&amp;#8217;)); &lt;br /&gt;myLabel.initialize();&lt;/blockquote&gt; }&amp;#8221;&lt;/blockquote&gt;
&lt;p&gt;// this could should have error checking for nulls. &lt;br /&gt;Page.ClientScriptManager.RegisterStartupScript (javaScriptFunction); &lt;/p&gt;
&lt;p&gt;ScriptManager myScriptManager = ScriptManager.GetCurrent(Page); &lt;br /&gt;if (myScriptManager.IsInPartialRenderingMode) &lt;br /&gt;{ &lt;/p&gt;
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;Page.ClientScriptManager.RegisterStartupScript (&amp;#8220;myStartupFunction();&amp;#8221;);&lt;/blockquote&gt;} &lt;br /&gt;else &lt;br /&gt;{ 
&lt;blockquote dir="ltr" style="MARGIN-RIGHT: 0px"&gt;Page.ClientScriptManager.RegisterStartupScript (&amp;#8220;Sys.Application.load.add (myStartupFunction);&amp;#8221;);&lt;/blockquote&gt;
&lt;p&gt;}&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;In the above code where it tests myScriptManager.IsInPartialRenderingMode the code branches to either use the Sys.Application.load event or just emitting the function execution directly on the page. Emitting the function directly to the page (using RegisterStartupScript, which is a must!!) causes the code to be executed on parse. This time through the code won&amp;#8217;t throw an exception as all of the Atlas JavaScript files have been loaded and the Atlas Runtime has been started. &lt;/p&gt;
&lt;p&gt;So, there you have it. A way of executing JavaScript code that relies upon Atlas on both an initial load and a partial postback.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/joelrumerman/aggbug/3021.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Rumerman</dc:creator><title>Atlas: Page Lifecycle for Partial Postbacks</title><link>http://blogs.interknowlogy.com/joelrumerman/archive/2006/04/23/1933.aspx</link><pubDate>Sun, 23 Apr 2006 18:58:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/joelrumerman/archive/2006/04/23/1933.aspx</guid><description>&lt;p&gt;A piece of information that I&amp;#8217;ve tended to gloss over until now was that during a partial postback by means of an Atlas UpdatePanel, the server life cycle goes through a normal postback life cycle. I never gave this much thought until I was considering what this meant for performance. Were all of my controls re-rendering even if they weren&amp;#8217;t contained within an UpdatePanel that was set to update? How did the server side Atlas framework know to only send the HTML for the controls that were contained in an updating UpdatePanel down stream? Was there a way to make my code perform better knowing that I was working within the Atlas framework?&lt;/p&gt;
&lt;p&gt;The simple answers: &lt;strong&gt;Yes. The framework is smart. I&amp;#8217;m not too sure.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The more complete answers &amp;#8230;.&lt;/p&gt;
&lt;p&gt;All controls are participating in the postback in normal life cycle fashion. Their viewstate is loaded; their controls created; their data, bound. The major difference occurred when it came to any of the render methods (BeginRender, Render, EndRender, AddAttributesToRender, etc.) that normally had an HtmlWriter parameter. Here, in one of the previously stated methods (e.g. Render) an updating UpdatePanel used a normal HtmlWriter parameter as expected. However, in the same method within a control that wasn&amp;#8217;t within an updating UpdatePanel, the parameter was of type &lt;strong&gt;Microsoft.Web.UI.DummyHtmlTextWriter&lt;/strong&gt;. Whoa &amp;#8230; what this means is that there are two HtmlWriters. Whether you are going to be re-rendered down to the browser or not determines which HtmlWriter is used.  (BTW, thank Microsoft for creating the DummyHtmlWriter type. I&amp;#8217;m pretty sure that they could have used a NullTextWriter when they didn&amp;#8217;t want a control&amp;#8217;s output to be sent to the browser, but if nothing else, the DummyHtmlWriter makes it really clear that this control isn&amp;#8217;t actually going to be sent to the browser.) &lt;/p&gt;
&lt;p&gt;The next logical question I had was why Microsoft didn&amp;#8217;t program it so that if a control wasn&amp;#8217;t going to be re-rendered and sent down to the browser it never entered the Render phase and therefore eliminating the need for the new DummyHtmlWriter type? The answer actually came from Microsoft because I was stuck on this one for a while. The reason for this was because the EventValidation hashcode is created in the Render method and when a page has EventValidation enabled (as all pages do normally and it&amp;#8217;s the default) the base Render method must execute at the appropriate time in order for this hashcode to be created. (As a side bar, to understand the Event Validation, see &lt;a href="http://odetocode.com/Blogs/scott/archive/2006/03/20/3145.aspx" target="_blank"&gt;K Scott Allen's Blog Entry on Event Validation&lt;/a&gt; or &lt;a href="http://blogs.gotdotnet.com/sburke/archive/2006/04/14/576421.aspx" target="_blank"&gt;Shawn Burke's Blog Entry on the Cascading Dropdown Control&lt;/a&gt;, but it pretty much prevents unauthorized postback values.) Therefore, in order for a page&amp;#8217;s EventValidation hashcode to be correct, all of its child controls must execute their render methods to create their hashcodes which can be passed up the chain and hence the reason that all controls must be re-rendered.&lt;/p&gt;
&lt;p&gt;Up until now, I&amp;#8217;ve answered my first two questions, but is there a way, knowing I&amp;#8217;m working within the Atlas Framework, to program slightly differently to make my code run faster? Truth-be-told, I don&amp;#8217;t see too much. There&amp;#8217;s a basic knowledge of knowing that I&amp;#8217;m in a postback and therefore loading or not loading data as appropriate, but other than that I&amp;#8217;m not sure. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;A question remains &amp;#8230; I have a drop down with the values 1, 2, 3. They are rendered initially, but not re-rendered on a postback. An UpatePanel causes a partial postback (does not contain the dropdown). Will I get an EventValidation exception if I perform a normal full postback? So normally if I perform a postback I would have to re-render the dropdown either from ViewState or from my initial data in order for the dropdown to display. But, if I perform a partial postback my dropdown values will still exist on the page because I&amp;#8217;m not replacing the Html associated to that area of the page. But the page&amp;#8217;s EventValidation hashcode won&amp;#8217;t contain the dropdown&amp;#8217;s values because they were never re-rendered. What happens when I perform a normal postback?? I&amp;#8217;ve been sitting in front of my computer on an awesome Sunday for way too long to test this right now, but I&amp;#8217;ll post a follow up soon. &lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/joelrumerman/aggbug/1933.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Joel Rumerman</dc:creator><title>Atlas: Creating a clientside bindable business object</title><link>http://blogs.interknowlogy.com/joelrumerman/archive/2006/03/29/1035.aspx</link><pubDate>Wed, 29 Mar 2006 22:55:00 GMT</pubDate><guid>http://blogs.interknowlogy.com/joelrumerman/archive/2006/03/29/1035.aspx</guid><description>&lt;p align="left"&gt;I&amp;rsquo;ve recently come across a situation in an application I&amp;rsquo;m working on where I&amp;rsquo;d like to bind a client side business object that is defined by a JSON statement to a series of labels. Out of the box, Atlas provides a way to bind one attribute of a component to an attribute of another component by defining a Sys.Binding object in JavaScript or a &amp;lt;binding&amp;gt; tag in xml-script and adding it to a component&amp;rsquo;s binding collection. For example, I can bind the text of a label to the text of a textbox or the cssClass of a button to a drop down list&amp;rsquo;s selected value.&amp;nbsp;There's also a way to bind a list of items to a ListView or other list type object using an Atlas Datasource, but it only works with DataTables and Arrays.&amp;nbsp;(There are complete code examples in the &lt;a href="http://atlas.asp.net/docs/atlas/doc/controls/default.aspx"&gt;Controls and UI &lt;/a&gt;Quickstart on the Atlas site.) However, my business object isn&amp;rsquo;t a Component, it&amp;rsquo;s just a server side state bag (entity object, domain object, whatever) that&amp;rsquo;s been serialized into JSON format so the browser can access it. So how do I make it participate in binding? &lt;/p&gt;
&lt;p align="left"&gt;In my research I realized that to accomplish something like this, the client side business object must be a Component itself as components can be bound to other components. (A good explanation of how binding works in Atlas can be found at &lt;a href="http://www.wilcob.com/Wilco/Atlas.aspx" target="_blank"&gt;Wilco Bauwer&amp;rsquo;s Blog&lt;/a&gt;&amp;nbsp;about 1/2 way down.) So I went about the path of&amp;nbsp;creating a business object that derives from Sys.Component so it can participate in bindings. &amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;(BTW, binding comes in handy when you &lt;em&gt;&lt;strong&gt;can't&lt;/strong&gt;&lt;/em&gt; use an UpdatePanel to refresh a control&amp;rsquo;s values such as when you're doing custom control development and you&amp;rsquo;re well past the InitComplete event when the control is added to the page.)&lt;/p&gt;
&lt;p align="left"&gt;So, following the pattern defined by other bindable controls in the Atlas framework such as&amp;nbsp;the label and textbox, I created a client-side object that inherits from Sys.Component. Inheriting from Sys.Component provides my business object with the capabilities to raise propertyChanged events and participate in bindings. (Actually, the INotifyPropertyChanged interface implemented by Sys.Component provides the propertyChanged ability.) &lt;/p&gt;
&lt;p align="left"&gt;On to the code &amp;hellip;&lt;/p&gt;
&lt;p align="left"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;script language="javascript" type="text/javascript"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // pageLoad fires automatically because it's tied to the application load event in Atlas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function pageLoad()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // define a new bindable business object&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindableKeyword = function ()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // execute the initializeBase method&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindableKeyword.initializeBase(this, [true]);&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // create some private variables.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var _createDate;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var _description;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var _name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // initialize function&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.initialize = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindableKeyword.callBaseMethod(this, 'initialize');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // create date getter &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.get_createDate = function()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _createDate;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // create date setter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.set_createDate = function (value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // if the current createdate value != the new value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_createDate != value) {&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // update the createDate's value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _createDate = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // raise the propertyChanged event&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.raisePropertyChanged('createDate');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // description getter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.get_description = function ()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _description;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // description setter&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.set_description = function (value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_description != value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _description = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.raisePropertyChanged('description');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // name getter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.get_name = function ()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return _name;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // name setter&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.set_name = function (value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (_name != value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _name = value;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.raisePropertyChanged('name');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // override the getDescriptor of the base class. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // This is where we define the bindable properties. &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.getDescriptor = function() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // execute the base class's getDescriptor to get the TypeDescription&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var td = BindableKeyword.callBaseMethod(this, 'getDescriptor');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // add the name property&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; td.addProperty('name', String);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // add the description property&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; td.addProperty('description', String);&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // add the createDate property&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; td.addProperty('createDate', String);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return td;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // register the override.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindableKeyword.registerBaseMethod(this, 'getDescriptor');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } // end keyword class&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Set the BindableKeyword's base class to Sys.Component. This is important as Sys.Component provides the framework&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // for binding to take place.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BindableKeyword.registerClass('BindableKeyword', Sys.Component);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sys.TypeDescriptor.addType('script', 'BindableKeyword', BindableKeyword);&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Some test code to play with my new BindableKeyword object.&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // create a new BindableKeyword.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var bindableKeyword = new BindableKeyword();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set the name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindableKeyword.set_name ("Test Name 1");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create an Atlas label that refers to one of the spans I declared in the HTML.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var lblName = new Sys.UI.Label($('lblName'));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Create the binding on the label&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var binding_1 = new Sys.Binding();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set the dataContext (really the dataSource) to be the BindableKeyword&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding_1.set_dataContext(bindableKeyword);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set the property path within the BindableKeyword to bind to.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding_1.set_dataPath('name');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set the property within the label to update with the data from the BindableKeyword&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding_1.set_property('text');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // setup the binding direction.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; binding_1.set_direction(Sys.BindingDirection.In);&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Add the binding to the label&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblName.get_bindings().add(binding_1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Initialize the label&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lblName.initialize();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindableKeyword.set_name ("Test Name 2");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alert ("pause");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; bindableKeyword.set_name ("After Set Name 3");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;form id="form1" runat="server"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;atlas:ScriptManager ID="sc1" runat="server"&amp;gt;&amp;lt;/atlas:ScriptManager&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;span id="lblName"&amp;gt;Unbound Name&amp;lt;/span&amp;gt; &amp;lt;span id="lblCreateDate"&amp;gt;Unbound Create Date&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;span id="lblDescription"&amp;gt;Unbound Description&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/form&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;/p&gt;
&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;
&lt;p align="left"&gt;Basically what I&amp;rsquo;m doing here is defining a business object that when properties are set, the raisePropertyChanged (propertyName) method provided by the base class is executed. This notifies any bindings bound to this property to update themselves. Once I&amp;rsquo;ve defined my business object in this manner, it can participate in bindings just like other Atlas components. By changing the binding&amp;rsquo;s direction to InOut, I could even update my business object with a user entered value. This would be useful for capturing data and placing it in a client side business object for validation. &lt;/p&gt;
&lt;p align="left"&gt;While this works, defining all of my business objects that need to participate in clientside binding is&amp;nbsp;a bit tedious. Also, if I am able to serialize my objects to JSON on the server and then emit the necessary JavaScript to place them on the client then defining them on the client isn&amp;rsquo;t really necessary as the deserialized JSON statement is already an object. All I need to know is the makeup of my server object to access the data on the client. But, to make them bindable I have to go through the definition process on the client. Ugh! Furthermore, it kills maintainability as if I add or remove a property from the server object I have to update the client object too. Double Ugh! If I can figure out a way to do something like this &amp;hellip; &amp;ldquo;var bindableObject = new BindableObject (keyword);&amp;rdquo; and then have all the pieces of keyword become bindable, that would be most excellent.&lt;/p&gt;
&lt;p align="left"&gt;That will be the subject of my next blog. If I can figure it out&amp;hellip;&lt;/p&gt;
&lt;p align="left"&gt;Comments??&lt;/p&gt;&lt;img src ="http://blogs.interknowlogy.com/joelrumerman/aggbug/1035.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>