<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>RichardSoeteman.net - ASP.NET</title>
    <link>http://www.richardsoeteman.net/</link>
    <description />
    <language>en-us</language>
    <copyright>Richard Soeteman</copyright>
    <lastBuildDate>Sun, 22 Feb 2009 10:38:11 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>richard@richardsoeteman.net</managingEditor>
    <webMaster>richard@richardsoeteman.net</webMaster>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=f470b6cf-40da-4aa9-a0d9-7b984fe9bf59</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,f470b6cf-40da-4aa9-a0d9-7b984fe9bf59.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,f470b6cf-40da-4aa9-a0d9-7b984fe9bf59.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=f470b6cf-40da-4aa9-a0d9-7b984fe9bf59</wfw:commentRss>
      <slash:comments>6</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Yesterday I gave a demo about events in <a title="Umbraco V4" href="http://www.umbraco.org/" target="_blank">Umbraco
V4</a>. I did this by describing a few "Business problems" that could be solved using
events. A few facts about events in Umbraco V4:
</p>
        <ul>
          <li>
You find events on every Component in Umbraco. 
</li>
          <li>
To uses events, you need references to the businesslogic, cms and interfaces assemlies. 
</li>
          <li>
To use events, you have to create a class that uses umbraco.BusinessLogic.ApplicationBase
as the base class.  In the constructor you can wire up the event handler. These
classes will be automaticly picked up when you put the file in the App_Code folder
of Umbraco or put the compiled DLL in the bin folder of Umbraco. I prefer the last
one. 
</li>
          <li>
Most of the event args derive from <a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.canceleventargs.aspx" target="_blank">CancelEventArgs</a>,
so we can cancel the operation. 
</li>
          <li>
Because an event executes in the background you should always document that you're
using events and make sure you will write a logmessage when you're event handler gets
executed. 
</li>
        </ul>
        <p>
For my demo's, I've used an Umbraco V4 installation with the Creative Website Wizard
installed.
</p>
        <h4>Demo 1 Auto Expire news
</h4>
        <p>
In the first demo.I've showed how the document.BeforePublish can be used to check
if  a news item is allready expired, if so cancel the publish event, otherwise
check if the expire date is set and if not, set the expire date to 14 days from now.
</p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> System.Collections.Generic;</pre>
          <pre>
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> System.Text;</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">using</span> umbraco.BusinessLogic;</pre>
          <pre>
            <span class="lnum"> 5: </span>
            <span class="kwrd">using</span> umbraco.cms.businesslogic.web;</pre>
          <pre>
            <span class="lnum"> 6: </span> </pre>
          <pre>
            <span class="lnum"> 7: </span>
            <span class="kwrd">namespace</span> AutoExpire</pre>
          <pre>
            <span class="lnum"> 8: </span>{</pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="rem">/// </span>
          </pre>
          <pre>
            <span class="lnum"> 11: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 12: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> Expire
:ApplicationBase</pre>
          <pre>
            <span class="lnum"> 13: </span> {</pre>
          <pre>
            <span class="lnum"> 14: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 15: </span>
            <span class="rem">///
Constructor used to wire up the event</span>
          </pre>
          <pre>
            <span class="lnum"> 16: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 17: </span>
            <span class="kwrd">public</span> Expire()</pre>
          <pre>
            <span class="lnum"> 18: </span> {</pre>
          <pre>
            <span class="lnum"> 19: </span> Document.BeforePublish
+= <span class="kwrd">new</span> Document.PublishEventHandler(Document_BeforePublish);</pre>
          <pre>
            <span class="lnum"> 20: </span> }</pre>
          <pre>
            <span class="lnum"> 21: </span> </pre>
          <pre>
            <span class="lnum"> 22: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 23: </span>
            <span class="rem">///
Check if the news item is expired, or check if we need to set the expire date</span>
          </pre>
          <pre>
            <span class="lnum"> 24: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 25: </span>
            <span class="kwrd">void</span> Document_BeforePublish(Document
sender, umbraco.cms.businesslogic.PublishEventArgs e)</pre>
          <pre>
            <span class="lnum"> 26: </span> {</pre>
          <pre>
            <span class="lnum"> 27: </span>
            <span class="rem">//Always
LOG</span>
          </pre>
          <pre>
            <span class="lnum"> 28: </span> Log.Add(LogTypes.Custom, sender.Id, <span class="str">"Event
raised"</span>);</pre>
          <pre>
            <span class="lnum"> 29: </span>
            <span class="rem">//Check
if the doctype is news</span>
          </pre>
          <pre>
            <span class="lnum"> 30: </span>
            <span class="kwrd">if</span> (sender.ContentType.Alias
== <span class="str">"News"</span>)</pre>
          <pre>
            <span class="lnum"> 31: </span> {</pre>
          <pre>
            <span class="lnum"> 32: </span>
            <span class="rem">//Check
if the expiredate is filled and the value is not allready expired</span>
          </pre>
          <pre>
            <span class="lnum"> 33: </span>
            <span class="kwrd">if</span> (sender.ExpireDate
!= DateTime.MinValue &amp;&amp; sender.ExpireDate &lt; DateTime.Now)</pre>
          <pre>
            <span class="lnum"> 34: </span> {</pre>
          <pre>
            <span class="lnum"> 35: </span>
            <span class="rem">//Item
is expired, cancel the publish</span>
          </pre>
          <pre>
            <span class="lnum"> 36: </span> e.Cancel
= <span class="kwrd">true</span>;</pre>
          <pre>
            <span class="lnum"> 37: </span> }</pre>
          <pre>
            <span class="lnum"> 38: </span>
            <span class="kwrd">else</span>
          </pre>
          <pre>
            <span class="lnum"> 39: </span> {</pre>
          <pre>
            <span class="lnum"> 40: </span>
            <span class="rem">//Date
is not set set it now and save the doc. Probably better to to this in the before save
event</span>
          </pre>
          <pre>
            <span class="lnum"> 41: </span>
            <span class="rem">//since this
is a demo it's allowed to do it here</span>
          </pre>
          <pre>
            <span class="lnum"> 42: </span> sender.ExpireDate
= DateTime.Now.AddDays(14);</pre>
          <pre>
            <span class="lnum"> 43: </span> sender.Save();</pre>
          <pre>
            <span class="lnum"> 44: </span> </pre>
          <pre>
            <span class="lnum"> 45: </span> }</pre>
          <pre>
            <span class="lnum"> 46: </span> }</pre>
          <pre>
            <span class="lnum"> 47: </span> }</pre>
          <pre>
            <span class="lnum"> 48: </span> }</pre>
          <pre>
            <span class="lnum"> 49: </span>}</pre>
        </div>
        <style type="text/css">



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
During this demo someone asked if it's possible to show a custom message in the speechbubble
event when an event is canceled. This is not possible (tested it this morning), I've
created an <a href="http://www.codeplex.com/umbraco/WorkItem/View.aspx?WorkItemId=21309" target="_blank">item
on CodePlex</a>. 
</p>
        <h4>Demo 2 Auto archive news
</h4>
        <p>
In this Demo I've created some functionality to automaticly move a news item to the
archive folder when a content manager sets the archive boolean to true. First an archive
boolean must be added to the news document and a new Archive folder must be created
where we can store the archived News items in.
</p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> umbraco.BusinessLogic;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> umbraco.cms.businesslogic.web;</pre>
          <pre>
            <span class="lnum"> 3: </span> </pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">namespace</span> AutoMoveToArchive</pre>
          <pre>
            <span class="lnum"> 5: </span>{</pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 7: </span>
            <span class="rem">///
Auto move demo</span>
          </pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> AutoMoveToArchive
: ApplicationBase</pre>
          <pre>
            <span class="lnum"> 10: </span> {</pre>
          <pre>
            <span class="lnum"> 11: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 12: </span>
            <span class="rem">///
Wire up the event handler</span>
          </pre>
          <pre>
            <span class="lnum"> 13: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 14: </span>
            <span class="kwrd">public</span> AutoMoveToArchive()</pre>
          <pre>
            <span class="lnum"> 15: </span> {</pre>
          <pre>
            <span class="lnum"> 16: </span> Document.BeforeSave
+= <span class="kwrd">new</span> Document.SaveEventHandler(Document_BeforeSave);</pre>
          <pre>
            <span class="lnum"> 17: </span> }</pre>
          <pre>
            <span class="lnum"> 18: </span> </pre>
          <pre>
            <span class="lnum"> 19: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 20: </span>
            <span class="rem">///
Before a documents get saved we wil check if the archived proerty is.</span>
          </pre>
          <pre>
            <span class="lnum"> 21: </span>
            <span class="rem">///
When it's set move it to the archive folder.</span>
          </pre>
          <pre>
            <span class="lnum"> 22: </span>
            <span class="rem">///
Again it;s demo code, normally you should also check if it's not allready IN the archived
foder ;-)</span>
          </pre>
          <pre>
            <span class="lnum"> 23: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 24: </span>
            <span class="kwrd">void</span> Document_BeforeSave(Document
sender, umbraco.cms.businesslogic.SaveEventArgs e)</pre>
          <pre>
            <span class="lnum"> 25: </span> {</pre>
          <pre>
            <span class="lnum"> 26: </span>
            <span class="rem">//
Set Arrchive folder id, no excuse to use hard coded values in Umbraco ;-)</span>
          </pre>
          <pre>
            <span class="lnum"> 27: </span>
            <span class="kwrd">int</span> archiveId
= 1123; </pre>
          <pre>
            <span class="lnum"> 28: </span>
            <span class="rem">//Log that we
are doing something</span>
          </pre>
          <pre>
            <span class="lnum"> 29: </span> Log.Add(LogTypes.Custom,
sender.Id, <span class="str">"Document After save Raised"</span>);</pre>
          <pre>
            <span class="lnum"> 30: </span> </pre>
          <pre>
            <span class="lnum"> 31: </span>
            <span class="rem">//Check
if the item is news and must be archived</span>
          </pre>
          <pre>
            <span class="lnum"> 32: </span>
            <span class="kwrd">if</span> (sender.ContentType.Alias
== <span class="str">"News"</span> &amp;&amp; sender.getProperty(<span class="str">"archived"</span>).Value.Equals(1))</pre>
          <pre>
            <span class="lnum"> 33: </span> {</pre>
          <pre>
            <span class="lnum"> 34: </span>
            <span class="rem">//Yes,
move to archive</span>
          </pre>
          <pre>
            <span class="lnum"> 35: </span> sender.Move(archiveId);</pre>
          <pre>
            <span class="lnum"> 36: </span> </pre>
          <pre>
            <span class="lnum"> 37: </span>
            <span class="rem">//Unpublish
from current Node</span>
          </pre>
          <pre>
            <span class="lnum"> 38: </span> umbraco.library.UnPublishSingleNode(sender.Id);</pre>
          <pre>
            <span class="lnum"> 39: </span> sender.UnPublish();</pre>
          <pre>
            <span class="lnum"> 40: </span>
            <span class="rem">//Publish
will get called if the user selected Save and publish</span>
          </pre>
          <pre>
            <span class="lnum"> 41: </span> }</pre>
          <pre>
            <span class="lnum"> 42: </span> }</pre>
          <pre>
            <span class="lnum"> 43: </span> }</pre>
          <pre>
            <span class="lnum"> 44: </span>}</pre>
        </div>
        <style type="text/css">



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <h4>Demo 3 Add Unpublish menu Item to the Context menu
</h4>
        <p>
In this demo I've showed that we can use events to modify the context menu. I'm missing
a unpublish item  in the context menu. This example is a little bit harder because
we we need to create a menu item also. A menu item can be created to create a class
that derives from the IAction interface. I will leave the explanation of this interface
for a future blogpost. 
</p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> umbraco.BusinessLogic;</pre>
          <pre>
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> umbraco.cms.presentation.Trees;</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">using</span> umbraco.interfaces;</pre>
          <pre>
            <span class="lnum"> 5: </span> </pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="kwrd">namespace</span> UnpublishAction</pre>
          <pre>
            <span class="lnum"> 7: </span>{</pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="rem">///
Add unpublish to the menu item</span>
          </pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 11: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> AddUnpublishActionEvent
:ApplicationBase</pre>
          <pre>
            <span class="lnum"> 12: </span> {</pre>
          <pre>
            <span class="lnum"> 13: </span>
            <span class="kwrd">public</span> AddUnpublishActionEvent()</pre>
          <pre>
            <span class="lnum"> 14: </span> {</pre>
          <pre>
            <span class="lnum"> 15: </span> BaseContentTree.BeforeNodeRender
+= <span class="kwrd">new</span> BaseTree.BeforeNodeRenderEventHandler(BaseTree_BeforeNodeRender);</pre>
          <pre>
            <span class="lnum"> 16: </span> }</pre>
          <pre>
            <span class="lnum"> 17: </span> </pre>
          <pre>
            <span class="lnum"> 18: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 19: </span>
            <span class="rem">///
Before a menu item gets rendered we will add the unpublish action if the document
is published</span>
          </pre>
          <pre>
            <span class="lnum"> 20: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 21: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> BaseTree_BeforeNodeRender(<span class="kwrd">ref</span> XmlTree
sender, <span class="kwrd">ref</span> XmlTreeNode node, EventArgs e)</pre>
          <pre>
            <span class="lnum"> 22: </span> {</pre>
          <pre>
            <span class="lnum"> 23: </span>
            <span class="rem">///Only
unpublish when published</span>
          </pre>
          <pre>
            <span class="lnum"> 24: </span>
            <span class="kwrd">if</span> (node.Menu!=
null &amp;&amp; !node.NotPublished.GetValueOrDefault(<span class="kwrd">true</span>))</pre>
          <pre>
            <span class="lnum"> 25: </span> {</pre>
          <pre>
            <span class="lnum"> 26: </span>
            <span class="rem">//Find
the publish action and add 1 for the index, so the position of the ubpublish is direct
after the publish menu item</span>
          </pre>
          <pre>
            <span class="lnum"> 27: </span>
            <span class="kwrd">int</span> index
= node.Menu.FindIndex(<span class="kwrd">delegate</span>(IAction a) { <span class="kwrd">return</span> a.Alias
== <span class="str">"publish"</span>; })+1;</pre>
          <pre>
            <span class="lnum"> 28: </span> </pre>
          <pre>
            <span class="lnum"> 29: </span>
            <span class="rem">//Insert
unpublish action</span>
          </pre>
          <pre>
            <span class="lnum"> 30: </span> node.Menu.Insert(index,
UnpublishAction.Instance);</pre>
          <pre>
            <span class="lnum"> 31: </span> }</pre>
          <pre>
            <span class="lnum"> 32: </span> }</pre>
          <pre>
            <span class="lnum"> 33: </span> }</pre>
          <pre>
            <span class="lnum"> 34: </span>}</pre>
        </div>
        <style type="text/css">



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
          <a href="http://www.richardsoeteman.net/downloads/Umbraco/unpublishmenuitem.zip" target="_blank">Download
the complete solution for this demo here</a>.
</p>
        <h4>Demo 4 Invisible for Writer Usertype
</h4>
        <p>
In the last demo I've showed how to use the AfterNodeRender event to make protected
nodes invisble for the Writer UserType
</p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> umbraco.BusinessLogic;</pre>
          <pre>
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> umbraco.cms.presentation.Trees;</pre>
          <pre>
            <span class="lnum"> 4: </span> </pre>
          <pre>
            <span class="lnum"> 5: </span>
            <span class="kwrd">namespace</span> OnlyForAdmins</pre>
          <pre>
            <span class="lnum"> 6: </span>{</pre>
          <pre>
            <span class="lnum"> 7: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="rem">///
Makes a document invisible for writers</span>
          </pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> MenuIsNotForWriters
: ApplicationBase</pre>
          <pre>
            <span class="lnum"> 11: </span> {</pre>
          <pre>
            <span class="lnum"> 12: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 13: </span>
            <span class="rem">///
Wire up the event handler</span>
          </pre>
          <pre>
            <span class="lnum"> 14: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 15: </span>
            <span class="kwrd">public</span> MenuIsNotForWriters()</pre>
          <pre>
            <span class="lnum"> 16: </span> {</pre>
          <pre>
            <span class="lnum"> 17: </span> BaseContentTree.AfterNodeRender
+= <span class="kwrd">new</span> BaseTree.AfterNodeRenderEventHandler(BaseContentTree_AfterNodeRender);</pre>
          <pre>
            <span class="lnum"> 18: </span> }</pre>
          <pre>
            <span class="lnum"> 19: </span> </pre>
          <pre>
            <span class="lnum"> 20: </span>
            <span class="rem">///
&lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 21: </span>
            <span class="rem">///
Removes node from menu tree if page is protected and the user is a writer</span>
          </pre>
          <pre>
            <span class="lnum"> 22: </span>
            <span class="rem">///
&lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 23: </span>
            <span class="kwrd">void</span> BaseContentTree_AfterNodeRender(<span class="kwrd">ref</span> XmlTree
sender, <span class="kwrd">ref</span> XmlTreeNode node, EventArgs e)</pre>
          <pre>
            <span class="lnum"> 24: </span> {</pre>
          <pre>
            <span class="lnum"> 25: </span>
            <span class="rem">//check
if page is protecetd and the usertype is writer</span>
          </pre>
          <pre>
            <span class="lnum"> 26: </span>
            <span class="kwrd">if</span> (node.IsProtected.GetValueOrDefault(<span class="kwrd">false</span>)
&amp;&amp; umbraco.helper.GetCurrentUmbracoUser().UserType.Alias == <span class="str">"writer"</span>)</pre>
          <pre>
            <span class="lnum"> 27: </span> {</pre>
          <pre>
            <span class="lnum"> 28: </span>
            <span class="rem">//Writers
cannot see protected pages</span>
          </pre>
          <pre>
            <span class="lnum"> 29: </span> sender.Remove(node);</pre>
          <pre>
            <span class="lnum"> 30: </span> }</pre>
          <pre>
            <span class="lnum"> 31: </span> }</pre>
          <pre>
            <span class="lnum"> 32: </span> }</pre>
          <pre>
            <span class="lnum"> 33: </span>}</pre>
        </div>
        <style type="text/css">



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
          <span class="lnum">
          </span>
        </p>
        <h4>Overview of all Events
</h4>
        <table cellspacing="0" cellpadding="2" width="400" border="0">
          <tbody>
            <tr>
              <td valign="top" width="162">
                <strong>Class</strong>
              </td>
              <td valign="top" width="263">
                <strong>Events</strong>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
Access</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
BeforeAddProtection 
<br />
AfterAddProtection 
<br />
BeforeRemoveProtection 
<br />
AfterRemoveProtection 
<br />
BeforeAddMemberShipRoleToDocument AfterAddMemberShipRoleToDocument BeforeRemoveMemberShipRoleToDocument
AfterRemoveMemberShipRoleToDocument BeforeRemoveMembershipUserFromDocument AfterRemoveMembershipUserFromDocument
BeforeAddMembershipUserToDocument AfterAddMembershipUserToDocument
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
BaseTree</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeNodeRender 
<br />
AfterNodeRender
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
CMSNode</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
AfterNew 
<br />
BeforeDelete 
<br />
AfterDelete 
<br />
BeforeMove 
<br />
AfterMove
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
content</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeUpdateDocumentCache 
<br />
AfterUpdateDocumentCache 
<br />
BeforeClearDocumentCache 
<br />
AfterClearDocumentCache 
<br />
BeforeRefreshContent 
<br />
AfterRefreshContent
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
CreatedPackage</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
<br />
BeforePublish 
<br />
AfterPublish 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
DataType</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
Saving 
<br />
New 
<br />
Deleting
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
Dictionary</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
Saving 
<br />
New 
<br />
Deleting 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
Document</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave  
<br />
AfterSave  
<br />
New  
<br />
BeforeDelete  
<br />
AfterDelete  
<br />
BeforePublish  
<br />
AfterPublish  
<br />
BeforeSendToPublish  
<br />
AfterSendToPublish  
<br />
BeforeUnPublish  
<br />
AfterUnPublish  
<br />
BeforeCopy  
<br />
AfterCopy  
<br />
BeforeRollBack  
<br />
AfterRollBack  
<br />
BeforeAddToIndex  
<br />
AfterAddToIndex
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
DocumentType</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
Domain</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
InstalledPackage</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
Language</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
Macro</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
Media</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
MediaType</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
Member</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeAddGroup 
<br />
AfterAddGroup 
<br />
BeforeRemoveGroup 
<br />
AfterRemoveGroup 
<br />
BeforeAddToCache 
<br />
AfterAddToCache 
<br />
BeforeDelete 
<br />
AfterDelete 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
MemberGroup</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
MemberType</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
StyleSheet</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
StylesheetProperty</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
Template</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="162">
User</td>
              <td valign="top" width="263">
 </td>
            </tr>
            <tr>
              <td valign="top" width="162">
 </td>
              <td valign="top" width="263">
                <p>
Saving 
<br />
New 
<br />
Disabling 
<br />
Deleting 
<br />
FlushingFromCache 
<br />
BeforeSave 
<br />
AfterSave 
<br />
New 
<br />
BeforeDelete 
<br />
AfterDelete 
<br />
BeforePublish 
<br />
AfterPublish
</p>
              </td>
            </tr>
          </tbody>
        </table>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=f470b6cf-40da-4aa9-a0d9-7b984fe9bf59" />
      </body>
      <title>Umbraco V4 events demo</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,f470b6cf-40da-4aa9-a0d9-7b984fe9bf59.aspx</guid>
      <link>http://www.richardsoeteman.net/2009/02/22/UmbracoV4EventsDemo.aspx</link>
      <pubDate>Sun, 22 Feb 2009 10:38:11 GMT</pubDate>
      <description>&lt;p&gt;
Yesterday I gave a demo about events in &lt;a title="Umbraco V4" href="http://www.umbraco.org/" target=_blank&gt;Umbraco
V4&lt;/a&gt;. I did this by describing a few "Business problems" that could be solved using
events. A few facts about events in Umbraco V4:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
You find events on every Component in Umbraco. 
&lt;li&gt;
To uses events, you need references to the businesslogic, cms and interfaces assemlies. 
&lt;li&gt;
To use events, you have to create a class that uses umbraco.BusinessLogic.ApplicationBase
as the base class.&amp;nbsp; In the constructor you can wire up the event handler. These
classes will be automaticly picked up when you put the file in the App_Code folder
of Umbraco or put the compiled DLL in the bin folder of Umbraco. I prefer the last
one. 
&lt;li&gt;
Most of the event args derive from &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.canceleventargs.aspx" target=_blank&gt;CancelEventArgs&lt;/a&gt;,
so we can cancel the operation. 
&lt;li&gt;
Because an event executes in the background you should always document that you're
using events and make sure you will write a logmessage when you're event handler gets
executed. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
For my demo's, I've used an Umbraco V4 installation with the Creative Website Wizard
installed.
&lt;/p&gt;
&lt;h4&gt;Demo 1 Auto Expire news
&lt;/h4&gt;
&lt;p&gt;
In the first demo.I've showed how the document.BeforePublish can be used to check
if&amp;nbsp; a news item is allready expired, if so cancel the publish event, otherwise
check if the expire date is set and if not, set the expire date to 14 days from now.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre&gt;&lt;span class=lnum&gt; 1: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 2: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 3: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 4: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; umbraco.BusinessLogic;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 5: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; umbraco.cms.businesslogic.web;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 6: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 7: &lt;/span&gt;&lt;span class=kwrd&gt;namespace&lt;/span&gt; AutoExpire&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 8: &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 9: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 10: &lt;/span&gt; &lt;span class=rem&gt;/// &lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 11: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 12: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;class&lt;/span&gt; Expire
:ApplicationBase&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 13: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 14: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 15: &lt;/span&gt; &lt;span class=rem&gt;///
Constructor used to wire up the event&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 16: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 17: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; Expire()&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 18: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 19: &lt;/span&gt; Document.BeforePublish
+= &lt;span class=kwrd&gt;new&lt;/span&gt; Document.PublishEventHandler(Document_BeforePublish);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 20: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 21: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 22: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 23: &lt;/span&gt; &lt;span class=rem&gt;///
Check if the news item is expired, or check if we need to set the expire date&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 24: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 25: &lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; Document_BeforePublish(Document
sender, umbraco.cms.businesslogic.PublishEventArgs e)&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 26: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 27: &lt;/span&gt; &lt;span class=rem&gt;//Always
LOG&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 28: &lt;/span&gt; Log.Add(LogTypes.Custom, sender.Id, &lt;span class=str&gt;"Event
raised"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 29: &lt;/span&gt; &lt;span class=rem&gt;//Check if
the doctype is news&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 30: &lt;/span&gt; &lt;span class=kwrd&gt;if&lt;/span&gt; (sender.ContentType.Alias
== &lt;span class=str&gt;"News"&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 31: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 32: &lt;/span&gt; &lt;span class=rem&gt;//Check
if the expiredate is filled and the value is not allready expired&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 33: &lt;/span&gt; &lt;span class=kwrd&gt;if&lt;/span&gt; (sender.ExpireDate
!= DateTime.MinValue &amp;amp;&amp;amp; sender.ExpireDate &amp;lt; DateTime.Now)&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 34: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 35: &lt;/span&gt; &lt;span class=rem&gt;//Item
is expired, cancel the publish&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 36: &lt;/span&gt; e.Cancel
= &lt;span class=kwrd&gt;true&lt;/span&gt;;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 37: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 38: &lt;/span&gt; &lt;span class=kwrd&gt;else&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 39: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 40: &lt;/span&gt; &lt;span class=rem&gt;//Date
is not set set it now and save the doc. Probably better to to this in the before save
event&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 41: &lt;/span&gt; &lt;span class=rem&gt;//since this
is a demo it's allowed to do it here&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 42: &lt;/span&gt; sender.ExpireDate
= DateTime.Now.AddDays(14);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 43: &lt;/span&gt; sender.Save();&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 44: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 45: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 46: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 47: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 48: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 49: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
During this demo someone asked if it's possible to show a custom message in the speechbubble
event when an event is canceled. This is not possible (tested it this morning), I've
created an &lt;a href="http://www.codeplex.com/umbraco/WorkItem/View.aspx?WorkItemId=21309" target=_blank&gt;item
on CodePlex&lt;/a&gt;. 
&lt;/p&gt;
&lt;h4&gt;Demo 2 Auto archive news
&lt;/h4&gt;
&lt;p&gt;
In this Demo I've created some functionality to automaticly move a news item to the
archive folder when a content manager sets the archive boolean to true. First an archive
boolean must be added to the news document and a new Archive folder must be created
where we can store the archived News items in.
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre&gt;&lt;span class=lnum&gt; 1: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; umbraco.BusinessLogic;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 2: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; umbraco.cms.businesslogic.web;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 3: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 4: &lt;/span&gt;&lt;span class=kwrd&gt;namespace&lt;/span&gt; AutoMoveToArchive&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 5: &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 6: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 7: &lt;/span&gt; &lt;span class=rem&gt;///
Auto move demo&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 8: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 9: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;class&lt;/span&gt; AutoMoveToArchive
: ApplicationBase&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 10: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 11: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 12: &lt;/span&gt; &lt;span class=rem&gt;///
Wire up the event handler&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 13: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 14: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; AutoMoveToArchive()&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 15: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 16: &lt;/span&gt; Document.BeforeSave
+= &lt;span class=kwrd&gt;new&lt;/span&gt; Document.SaveEventHandler(Document_BeforeSave);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 17: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 18: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 19: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 20: &lt;/span&gt; &lt;span class=rem&gt;///
Before a documents get saved we wil check if the archived proerty is.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 21: &lt;/span&gt; &lt;span class=rem&gt;///
When it's set move it to the archive folder.&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 22: &lt;/span&gt; &lt;span class=rem&gt;///
Again it;s demo code, normally you should also check if it's not allready IN the archived
foder ;-)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 23: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 24: &lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; Document_BeforeSave(Document
sender, umbraco.cms.businesslogic.SaveEventArgs e)&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 25: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 26: &lt;/span&gt; &lt;span class=rem&gt;//
Set Arrchive folder id, no excuse to use hard coded values in Umbraco ;-)&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 27: &lt;/span&gt; &lt;span class=kwrd&gt;int&lt;/span&gt; archiveId
= 1123; &lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 28: &lt;/span&gt; &lt;span class=rem&gt;//Log that we are
doing something&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 29: &lt;/span&gt; Log.Add(LogTypes.Custom,
sender.Id, &lt;span class=str&gt;"Document After save Raised"&lt;/span&gt;);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 30: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 31: &lt;/span&gt; &lt;span class=rem&gt;//Check
if the item is news and must be archived&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 32: &lt;/span&gt; &lt;span class=kwrd&gt;if&lt;/span&gt; (sender.ContentType.Alias
== &lt;span class=str&gt;"News"&lt;/span&gt; &amp;amp;&amp;amp; sender.getProperty(&lt;span class=str&gt;"archived"&lt;/span&gt;).Value.Equals(1))&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 33: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 34: &lt;/span&gt; &lt;span class=rem&gt;//Yes,
move to archive&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 35: &lt;/span&gt; sender.Move(archiveId);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 36: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 37: &lt;/span&gt; &lt;span class=rem&gt;//Unpublish
from current Node&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 38: &lt;/span&gt; umbraco.library.UnPublishSingleNode(sender.Id);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 39: &lt;/span&gt; sender.UnPublish();&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 40: &lt;/span&gt; &lt;span class=rem&gt;//Publish
will get called if the user selected Save and publish&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 41: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 42: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 43: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 44: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;h4&gt;Demo 3 Add Unpublish menu Item to the Context menu
&lt;/h4&gt;
&lt;p&gt;
In this demo I've showed that we can use events to modify the context menu. I'm missing
a unpublish item&amp;nbsp; in the context menu. This example is a little bit harder because
we we need to create a menu item also. A menu item can be created to create a class
that derives from the IAction interface. I will leave the explanation of this interface
for a future blogpost. 
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre&gt;&lt;span class=lnum&gt; 1: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 2: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; umbraco.BusinessLogic;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 3: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; umbraco.cms.presentation.Trees;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 4: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; umbraco.interfaces;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 5: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 6: &lt;/span&gt;&lt;span class=kwrd&gt;namespace&lt;/span&gt; UnpublishAction&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 7: &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 8: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 9: &lt;/span&gt; &lt;span class=rem&gt;///
Add unpublish to the menu item&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 10: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 11: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;class&lt;/span&gt; AddUnpublishActionEvent
:ApplicationBase&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 12: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 13: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; AddUnpublishActionEvent()&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 14: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 15: &lt;/span&gt; BaseContentTree.BeforeNodeRender
+= &lt;span class=kwrd&gt;new&lt;/span&gt; BaseTree.BeforeNodeRenderEventHandler(BaseTree_BeforeNodeRender);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 16: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 17: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 18: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 19: &lt;/span&gt; &lt;span class=rem&gt;///
Before a menu item gets rendered we will add the unpublish action if the document
is published&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 20: &lt;/span&gt; &lt;span class=rem&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 21: &lt;/span&gt; &lt;span class=kwrd&gt;private&lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; BaseTree_BeforeNodeRender(&lt;span class=kwrd&gt;ref&lt;/span&gt; XmlTree
sender, &lt;span class=kwrd&gt;ref&lt;/span&gt; XmlTreeNode node, EventArgs e)&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 22: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 23: &lt;/span&gt; &lt;span class=rem&gt;///Only
unpublish when published&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 24: &lt;/span&gt; &lt;span class=kwrd&gt;if&lt;/span&gt; (node.Menu!=
null &amp;amp;&amp;amp; !node.NotPublished.GetValueOrDefault(&lt;span class=kwrd&gt;true&lt;/span&gt;))&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 25: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 26: &lt;/span&gt; &lt;span class=rem&gt;//Find
the publish action and add 1 for the index, so the position of the ubpublish is direct
after the publish menu item&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 27: &lt;/span&gt; &lt;span class=kwrd&gt;int&lt;/span&gt; index
= node.Menu.FindIndex(&lt;span class=kwrd&gt;delegate&lt;/span&gt;(IAction a) { &lt;span class=kwrd&gt;return&lt;/span&gt; a.Alias
== &lt;span class=str&gt;"publish"&lt;/span&gt;; })+1;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 28: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 29: &lt;/span&gt; &lt;span class=rem&gt;//Insert
unpublish action&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 30: &lt;/span&gt; node.Menu.Insert(index,
UnpublishAction.Instance);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 31: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 32: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 33: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 34: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
&lt;a href="http://www.richardsoeteman.net/downloads/Umbraco/unpublishmenuitem.zip" target=_blank&gt;Download
the complete solution for this demo here&lt;/a&gt;.
&lt;/p&gt;
&lt;h4&gt;Demo 4 Invisible for Writer Usertype
&lt;/h4&gt;
&lt;p&gt;
In the last demo I've showed how to use the AfterNodeRender event to make protected
nodes invisble for the Writer UserType
&lt;/p&gt;
&lt;div class=csharpcode&gt;&lt;pre&gt;&lt;span class=lnum&gt; 1: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; System;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 2: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; umbraco.BusinessLogic;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 3: &lt;/span&gt;&lt;span class=kwrd&gt;using&lt;/span&gt; umbraco.cms.presentation.Trees;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 4: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 5: &lt;/span&gt;&lt;span class=kwrd&gt;namespace&lt;/span&gt; OnlyForAdmins&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 6: &lt;/span&gt;{&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 7: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 8: &lt;/span&gt; &lt;span class=rem&gt;///
Makes a document invisible for writers&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 9: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 10: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; &lt;span class=kwrd&gt;class&lt;/span&gt; MenuIsNotForWriters
: ApplicationBase&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 11: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 12: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 13: &lt;/span&gt; &lt;span class=rem&gt;///
Wire up the event handler&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 14: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 15: &lt;/span&gt; &lt;span class=kwrd&gt;public&lt;/span&gt; MenuIsNotForWriters()&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 16: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 17: &lt;/span&gt; BaseContentTree.AfterNodeRender
+= &lt;span class=kwrd&gt;new&lt;/span&gt; BaseTree.AfterNodeRenderEventHandler(BaseContentTree_AfterNodeRender);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 18: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 19: &lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 20: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 21: &lt;/span&gt; &lt;span class=rem&gt;///
Removes node from menu tree if page is protected and the user is a writer&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 22: &lt;/span&gt; &lt;span class=rem&gt;///
&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 23: &lt;/span&gt; &lt;span class=kwrd&gt;void&lt;/span&gt; BaseContentTree_AfterNodeRender(&lt;span class=kwrd&gt;ref&lt;/span&gt; XmlTree
sender, &lt;span class=kwrd&gt;ref&lt;/span&gt; XmlTreeNode node, EventArgs e)&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 24: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 25: &lt;/span&gt; &lt;span class=rem&gt;//check
if page is protecetd and the usertype is writer&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 26: &lt;/span&gt; &lt;span class=kwrd&gt;if&lt;/span&gt; (node.IsProtected.GetValueOrDefault(&lt;span class=kwrd&gt;false&lt;/span&gt;)
&amp;amp;&amp;amp; umbraco.helper.GetCurrentUmbracoUser().UserType.Alias == &lt;span class=str&gt;"writer"&lt;/span&gt;)&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 27: &lt;/span&gt; {&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 28: &lt;/span&gt; &lt;span class=rem&gt;//Writers
cannot see protected pages&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 29: &lt;/span&gt; sender.Remove(node);&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 30: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 31: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 32: &lt;/span&gt; }&lt;/pre&gt;&lt;pre&gt;&lt;span class=lnum&gt; 33: &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type=text/css&gt;



.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;
&lt;span class=lnum&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;h4&gt;Overview of all Events
&lt;/h4&gt;
&lt;table cellspacing=0 cellpadding=2 width=400 border=0&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&lt;strong&gt;Class&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;strong&gt;Events&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
Access&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
BeforeAddProtection 
&lt;br&gt;
AfterAddProtection 
&lt;br&gt;
BeforeRemoveProtection 
&lt;br&gt;
AfterRemoveProtection 
&lt;br&gt;
BeforeAddMemberShipRoleToDocument AfterAddMemberShipRoleToDocument BeforeRemoveMemberShipRoleToDocument
AfterRemoveMemberShipRoleToDocument BeforeRemoveMembershipUserFromDocument AfterRemoveMembershipUserFromDocument
BeforeAddMembershipUserToDocument AfterAddMembershipUserToDocument
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
BaseTree&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeNodeRender 
&lt;br&gt;
AfterNodeRender
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
CMSNode&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
AfterNew 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;br&gt;
BeforeMove 
&lt;br&gt;
AfterMove
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
content&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeUpdateDocumentCache 
&lt;br&gt;
AfterUpdateDocumentCache 
&lt;br&gt;
BeforeClearDocumentCache 
&lt;br&gt;
AfterClearDocumentCache 
&lt;br&gt;
BeforeRefreshContent 
&lt;br&gt;
AfterRefreshContent
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
CreatedPackage&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;br&gt;
BeforePublish 
&lt;br&gt;
AfterPublish 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
DataType&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
Saving 
&lt;br&gt;
New 
&lt;br&gt;
Deleting
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
Dictionary&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
Saving 
&lt;br&gt;
New 
&lt;br&gt;
Deleting 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
Document&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave&amp;nbsp; 
&lt;br&gt;
AfterSave&amp;nbsp; 
&lt;br&gt;
New&amp;nbsp; 
&lt;br&gt;
BeforeDelete&amp;nbsp; 
&lt;br&gt;
AfterDelete&amp;nbsp; 
&lt;br&gt;
BeforePublish&amp;nbsp; 
&lt;br&gt;
AfterPublish&amp;nbsp; 
&lt;br&gt;
BeforeSendToPublish&amp;nbsp; 
&lt;br&gt;
AfterSendToPublish&amp;nbsp; 
&lt;br&gt;
BeforeUnPublish&amp;nbsp; 
&lt;br&gt;
AfterUnPublish&amp;nbsp; 
&lt;br&gt;
BeforeCopy&amp;nbsp; 
&lt;br&gt;
AfterCopy&amp;nbsp; 
&lt;br&gt;
BeforeRollBack&amp;nbsp; 
&lt;br&gt;
AfterRollBack&amp;nbsp; 
&lt;br&gt;
BeforeAddToIndex&amp;nbsp; 
&lt;br&gt;
AfterAddToIndex
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
DocumentType&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
Domain&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
InstalledPackage&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
Language&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
Macro&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
Media&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
MediaType&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
Member&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeAddGroup 
&lt;br&gt;
AfterAddGroup 
&lt;br&gt;
BeforeRemoveGroup 
&lt;br&gt;
AfterRemoveGroup 
&lt;br&gt;
BeforeAddToCache 
&lt;br&gt;
AfterAddToCache 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
MemberGroup&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
MemberType&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
StyleSheet&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
StylesheetProperty&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
Template&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
User&lt;/td&gt;
&lt;td valign=top width=263&gt;
&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=top width=162&gt;
&amp;nbsp;&lt;/td&gt;
&lt;td valign=top width=263&gt;
&lt;p&gt;
Saving 
&lt;br&gt;
New 
&lt;br&gt;
Disabling 
&lt;br&gt;
Deleting 
&lt;br&gt;
FlushingFromCache 
&lt;br&gt;
BeforeSave 
&lt;br&gt;
AfterSave 
&lt;br&gt;
New 
&lt;br&gt;
BeforeDelete 
&lt;br&gt;
AfterDelete 
&lt;br&gt;
BeforePublish 
&lt;br&gt;
AfterPublish
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=f470b6cf-40da-4aa9-a0d9-7b984fe9bf59" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,f470b6cf-40da-4aa9-a0d9-7b984fe9bf59.aspx</comments>
      <category>ASP.NET</category>
      <category>Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=ca17291f-3ef8-4cd4-9791-185cb9bd7b42</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,ca17291f-3ef8-4cd4-9791-185cb9bd7b42.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,ca17291f-3ef8-4cd4-9791-185cb9bd7b42.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ca17291f-3ef8-4cd4-9791-185cb9bd7b42</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
        </p>
        <p>
Cheat sheets zijn echt handige hulpmiddelen om snel je informatie te vinden. Voor
de ASP.Net AJAX Library zijn o.a. de volgende cheat sheets beschikbaar: 
</p>
        <ul>
          <li>
            <a title="http://aspnetresources.com/downloads/MS%20Ajax%20Client%20Life-Cycle%20Events.pdf" href="http://aspnetresources.com/downloads/MS%20Ajax%20Client%20Life-Cycle%20Events.pdf" target="_blank">Microsoft
ASP.NET AJAX Client Life Cycle</a>
          </li>
          <li>
            <a href="http://aspnetresources.com/blog/ms_ajax_cheat_sheets_batch2.aspx" target="_blank">Library
bestaande uit:</a>
            <ul>
              <li>
Domelement class 
</li>
              <li>
Domevent class 
</li>
              <li>
String, object, number, date, boolean,array en error extensions</li>
            </ul>
          </li>
          <li>
            <a href="http://codebetter.com/blogs/jay.kimble/archive/2007/02/20/MS-Ajax-ClientScript-Cheat-Sheets-_2800_by-me_2900_.aspx" target="_blank">Client
script API</a>
          </li>
        </ul>
        <p>
 
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ca17291f-3ef8-4cd4-9791-185cb9bd7b42" />
      </body>
      <title>ASP.NET AJAX Library cheat sheets</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,ca17291f-3ef8-4cd4-9791-185cb9bd7b42.aspx</guid>
      <link>http://www.richardsoeteman.net/2007/07/02/ASPNETAJAXLibraryCheatSheets.aspx</link>
      <pubDate>Mon, 02 Jul 2007 07:23:29 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Cheat sheets zijn echt handige hulpmiddelen om snel je informatie te vinden. Voor
de ASP.Net AJAX Library zijn o.a. de volgende cheat sheets beschikbaar: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a title=http://aspnetresources.com/downloads/MS%20Ajax%20Client%20Life-Cycle%20Events.pdf href="http://aspnetresources.com/downloads/MS%20Ajax%20Client%20Life-Cycle%20Events.pdf" target=_blank&gt;Microsoft
ASP.NET AJAX Client Life Cycle&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://aspnetresources.com/blog/ms_ajax_cheat_sheets_batch2.aspx" target=_blank&gt;Library
bestaande uit:&lt;/a&gt; 
&lt;ul&gt;
&lt;li&gt;
Domelement class 
&lt;li&gt;
Domevent class 
&lt;li&gt;
String, object, number, date, boolean,array en&amp;nbsp;error&amp;nbsp;extensions&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
&lt;a href="http://codebetter.com/blogs/jay.kimble/archive/2007/02/20/MS-Ajax-ClientScript-Cheat-Sheets-_2800_by-me_2900_.aspx" target=_blank&gt;Client
script API&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ca17291f-3ef8-4cd4-9791-185cb9bd7b42" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,ca17291f-3ef8-4cd4-9791-185cb9bd7b42.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=051367c2-37ca-4605-901f-7b82dfeb9c56</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,051367c2-37ca-4605-901f-7b82dfeb9c56.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,051367c2-37ca-4605-901f-7b82dfeb9c56.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=051367c2-37ca-4605-901f-7b82dfeb9c56</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.richardsoeteman.net/PermaLink,guid,b94932ce-d069-420f-ae93-9ff50fe67bab.aspx" target="_blank">Vorig
jaar</a> heb ik het al eens heel kort gehad over het vernieuwde compilatie en deployment
model. Dit onderwerp is echter zeer uitgebreid. <a href="http://west-wind.com/WebLog/default.aspx" target="_blank">Rick
Strahl</a> heeft hier een zeer uitgebreid <a href="http://west-wind.com/presentations/AspNetCompilation/AspNetCompilation.asp" target="_blank">artikel</a> over
geschreven. Rick Strahl is tevens de maker van de tool die ik destijds genoemd had.
Dit artikel is een must read.
</p>
        <p>
          <a title="Compilation and Deployment in ASP.NET 2.0" href="http://west-wind.com/presentations/AspNetCompilation/AspNetCompilation.asp" target="_blank">Link
naar het het artikel.</a>
        </p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=051367c2-37ca-4605-901f-7b82dfeb9c56" />
      </body>
      <title>Compilatie en Deployment in ASP.NET 2.0</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,051367c2-37ca-4605-901f-7b82dfeb9c56.aspx</guid>
      <link>http://www.richardsoeteman.net/2006/11/02/CompilatieEnDeploymentInASPNET20.aspx</link>
      <pubDate>Thu, 02 Nov 2006 07:18:49 GMT</pubDate>
      <description>&lt;p&gt;
&lt;a href="http://www.richardsoeteman.net/PermaLink,guid,b94932ce-d069-420f-ae93-9ff50fe67bab.aspx" target="_blank"&gt;Vorig
jaar&lt;/a&gt; heb ik het al eens heel kort gehad over het vernieuwde compilatie en deployment
model. Dit onderwerp is echter zeer uitgebreid. &lt;a href="http://west-wind.com/WebLog/default.aspx" target="_blank"&gt;Rick
Strahl&lt;/a&gt; heeft hier een zeer uitgebreid &lt;a href="http://west-wind.com/presentations/AspNetCompilation/AspNetCompilation.asp" target="_blank"&gt;artikel&lt;/a&gt; over
geschreven. Rick Strahl is tevens de maker van de tool die ik destijds genoemd had.
Dit artikel is een must read.
&lt;/p&gt;
&lt;p&gt;
&lt;a title="Compilation and Deployment in ASP.NET 2.0" href="http://west-wind.com/presentations/AspNetCompilation/AspNetCompilation.asp" target="_blank"&gt;Link
naar het het artikel.&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=051367c2-37ca-4605-901f-7b82dfeb9c56" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,051367c2-37ca-4605-901f-7b82dfeb9c56.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=43f1fdf1-c244-4864-b57d-6d8041a25f05</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,43f1fdf1-c244-4864-b57d-6d8041a25f05.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,43f1fdf1-c244-4864-b57d-6d8041a25f05.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=43f1fdf1-c244-4864-b57d-6d8041a25f05</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Inmiddels is het al weer bijna twee weken geleden dat Microsoft ASP.NET Ajax Beta
heeft released. Het project waar ik aan werk maakte gebruik van ATLAS en de upgrade
van een CTP kostte ons slechts enkele minuten.  De upgrade van ATLAS naar Ajax
.Net ging echter niet zo simpel. Dit heeft me overigens wel verbaasd heeft omdat de
CTP releases erg goed waren, een gemiste kans.  Lees <a href="http://ajax.asp.net/files/Migration%20Guide.doc" target="_blank">dit
migratiedocument</a> en let bij een upgrade op het onderstaande:
</p>
        <h3>Configuratie:
</h3>
        <p>
De configuratie in web.config is compleet veranderd. Appendix "Manual Configuration
Changes" beschrijft hoe je je huidige web.config kan aanpassen.
</p>
        <h3>Aanpassing van tagprefix:
</h3>
        <p>
Verder is de Prefix &lt;ATLAS:/&gt; veranderd in &lt;ASP:/&gt;. Dit houdt
in dat je al je verwijzingen dus kan aanpassen.  
</p>
        <h3>Deployment:
</h3>
        <p>
Voorheen werd een losse DLL geleverd. Deze kon je in je bin folder plaatsen en je
had direct ATLAS functionaliteit. In de huidige versie wordt de DLL in de GAC
geplaatst. Wanneer je een deployment naar een server waar de installatie niet is uitgevoerd,
bijvoorbeeld een hosting provider kom je in de problemen omdat de Microsoft.Web.Extensions DLL
niet gevonden wordt. Je krijgt onderstaande foutmelding te zien:
</p>
        <p>
Could not load file or assembly 'Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find
the file specified. 
</p>
        <p>
De Microsoft.Web.Extensions DLL is echter wel gemakkelijk uit de GAC te halen. Je
zult dit echter via de Command Line moeten doen, omdat windows explorer de Assembly
folder anders weergeeft dan normale folders en de DLL's dus niet te kopiëren zijn.
</p>
        <ol>
          <li>
CMD 
</li>
          <li>
CD c:\windows\assembly\Gac_msil\microsoft.web.extensions\1.* 
</li>
          <li>
copy microsoft.web.extensions.dll [type hier de binfolder waar de dll geplaatst moet
worden]</li>
        </ol>
        <h3>Meer Info
</h3>
        <p>
Deze post beschrijft alleen de punten die we zelf tegengekomen zijn tijdens
de migratie van ons project. We zijn nog een probleem tegen aangelopen met HTTPModules
waarover later meer. Voor meer informatie zie de volgende resources:
</p>
        <ul>
          <li>
            <a href="http://ajax.asp.net/" target="_blank">ASP.NET AJAX</a>
          </li>
          <li>
            <a href="http://weblogs.asp.net/scottgu/archive/2006/10/20/ASP.NET-AJAX-Beta-1-Released.aspx" target="_blank">ASP.NET
AJAX Beta 1 Released</a>
          </li>
          <li>
            <a href="http://west-wind.com/weblog/posts/8265.aspx" target="_blank">First look and
few thoughts on the Microsoft AJAX Beta</a>
          </li>
          <li>
            <a href="http://west-wind.com/weblog/posts/8282.aspx" target="_blank">More MS Ajax
Pain</a>
          </li>
          <li>
            <a href="http://ajax.asp.net/files/Migration%20Guide.doc" target="_blank">Migratiedocument</a>
          </li>
        </ul>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=43f1fdf1-c244-4864-b57d-6d8041a25f05" />
      </body>
      <title>Van ATLAS CTP naar ASP.NET Ajax 1.0 Beta</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,43f1fdf1-c244-4864-b57d-6d8041a25f05.aspx</guid>
      <link>http://www.richardsoeteman.net/2006/10/31/VanATLASCTPNaarASPNETAjax10Beta.aspx</link>
      <pubDate>Tue, 31 Oct 2006 21:21:21 GMT</pubDate>
      <description>&lt;p&gt;
Inmiddels is het al weer bijna twee weken geleden dat Microsoft ASP.NET Ajax Beta
heeft released. Het project waar ik aan werk maakte&amp;nbsp;gebruik van ATLAS en de upgrade
van een CTP kostte ons slechts enkele minuten.&amp;nbsp; De upgrade van ATLAS naar Ajax
.Net ging echter niet zo simpel. Dit heeft me overigens wel verbaasd heeft omdat de
CTP releases erg goed waren, een gemiste kans.&amp;nbsp;&amp;nbsp;Lees &lt;a href="http://ajax.asp.net/files/Migration%20Guide.doc" target=_blank&gt;dit
migratiedocument&lt;/a&gt; en&amp;nbsp;let bij een upgrade op het onderstaande:
&lt;/p&gt;
&lt;h3&gt;Configuratie:
&lt;/h3&gt;
&lt;p&gt;
De configuratie in web.config is compleet veranderd. Appendix "Manual Configuration
Changes" beschrijft hoe je je huidige web.config kan aanpassen.
&lt;/p&gt;
&lt;h3&gt;Aanpassing&amp;nbsp;van tagprefix:
&lt;/h3&gt;
&lt;p&gt;
Verder is de Prefix &amp;lt;ATLAS:/&amp;gt;&amp;nbsp;veranderd in&amp;nbsp;&amp;lt;ASP:/&amp;gt;. Dit houdt
in dat je al je verwijzingen dus kan aanpassen. &amp;nbsp;
&lt;/p&gt;
&lt;h3&gt;Deployment:
&lt;/h3&gt;
&lt;p&gt;
Voorheen werd een losse DLL geleverd. Deze kon je in je bin folder plaatsen en je
had direct ATLAS functionaliteit. In de huidige versie wordt de&amp;nbsp;DLL in de GAC
geplaatst. Wanneer je een deployment naar een server waar de installatie niet is uitgevoerd,
bijvoorbeeld een hosting provider kom je in de problemen&amp;nbsp;omdat de Microsoft.Web.Extensions&amp;nbsp;DLL
niet gevonden wordt. Je krijgt onderstaande foutmelding te zien:
&lt;/p&gt;
&lt;p&gt;
Could not load file or assembly 'Microsoft.Web.Extensions, Version=1.0.61025.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find
the file specified. 
&lt;p&gt;
De Microsoft.Web.Extensions DLL is echter wel gemakkelijk uit de GAC te halen. Je
zult dit echter via de Command Line moeten doen, omdat windows explorer de Assembly
folder anders weergeeft dan normale folders en de DLL's dus niet te kopiëren zijn.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
CMD 
&lt;li&gt;
CD&amp;nbsp;c:\windows\assembly\Gac_msil\microsoft.web.extensions\1.* 
&lt;li&gt;
copy microsoft.web.extensions.dll [type hier de binfolder waar de dll geplaatst moet
worden]&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Meer Info
&lt;/h3&gt;
&lt;p&gt;
Deze&amp;nbsp;post beschrijft alleen de punten die&amp;nbsp;we zelf tegengekomen zijn tijdens
de migratie van ons project. We zijn nog een probleem tegen&amp;nbsp;aangelopen met HTTPModules
waarover later meer. Voor meer informatie zie de volgende resources:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://ajax.asp.net/" target=_blank&gt;ASP.NET AJAX&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://weblogs.asp.net/scottgu/archive/2006/10/20/ASP.NET-AJAX-Beta-1-Released.aspx" target=_blank&gt;ASP.NET
AJAX Beta 1 Released&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://west-wind.com/weblog/posts/8265.aspx" target=_blank&gt;First look and
few thoughts on the Microsoft AJAX Beta&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://west-wind.com/weblog/posts/8282.aspx" target=_blank&gt;More MS Ajax Pain&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://ajax.asp.net/files/Migration%20Guide.doc" target=_blank&gt;Migratiedocument&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=43f1fdf1-c244-4864-b57d-6d8041a25f05" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,43f1fdf1-c244-4864-b57d-6d8041a25f05.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=a7eeef0e-a10f-4ad3-806e-a6c7cb3574a9</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,a7eeef0e-a10f-4ad3-806e-a6c7cb3574a9.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,a7eeef0e-a10f-4ad3-806e-a6c7cb3574a9.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a7eeef0e-a10f-4ad3-806e-a6c7cb3574a9</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
De bekende ASP.NET Page lifecycle poster gemaakt door Léon Andrianarivony. Aangezien
de link naar zijn site niet meer werkt heb ik besloten hem op mijn eigen weblog te
plaatsen.
</p>
        <p align="center">
          <a href="http://www.richardsoeteman.net/content/binary/aspnetpagelifecycle.jpg" target="_new">
            <img src="http://www.richardsoeteman.net/content/binary/aspnetpagelifecycle-small.jpg" border="0" />
          </a>
          <br />
          <br />
          <a href="http://www.richardsoeteman.net/content/binary/aspnetpagelifecycle.jpg" target="_new">Download
de poster op ware grootte</a>
        </p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=a7eeef0e-a10f-4ad3-806e-a6c7cb3574a9" />
      </body>
      <title>ASP.NET 2.0 Page LifeCycle</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,a7eeef0e-a10f-4ad3-806e-a6c7cb3574a9.aspx</guid>
      <link>http://www.richardsoeteman.net/2006/08/17/ASPNET20PageLifeCycle.aspx</link>
      <pubDate>Thu, 17 Aug 2006 19:38:57 GMT</pubDate>
      <description>&lt;p&gt;
De bekende ASP.NET Page lifecycle poster gemaakt door Léon Andrianarivony. Aangezien
de link naar zijn site niet meer werkt heb ik besloten hem op mijn eigen weblog te
plaatsen.
&lt;/p&gt;
&lt;p align=center&gt;
&lt;a href="http://www.richardsoeteman.net/content/binary/aspnetpagelifecycle.jpg" target=_new&gt;&lt;img src="http://www.richardsoeteman.net/content/binary/aspnetpagelifecycle-small.jpg" border=0&gt;&lt;/a&gt;
&lt;br&gt;
&lt;br&gt;
&lt;a href="http://www.richardsoeteman.net/content/binary/aspnetpagelifecycle.jpg" target=_new&gt;Download
de poster op ware grootte&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=a7eeef0e-a10f-4ad3-806e-a6c7cb3574a9" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,a7eeef0e-a10f-4ad3-806e-a6c7cb3574a9.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=6db2adbd-e4af-403f-92bb-2f03d4ed9a2b</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,6db2adbd-e4af-403f-92bb-2f03d4ed9a2b.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,6db2adbd-e4af-403f-92bb-2f03d4ed9a2b.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6db2adbd-e4af-403f-92bb-2f03d4ed9a2b</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Afgelopen week wilde ik het standaard Xml Control wilde gebruiken, echter was het
niet mogelijk XSLT direct als String door te geven, wat voor mijn toepassing wel nodig
was. Voor de rest doet het Xml Control exact wat ik wil, dus uitbreiden maar. 
</p>
        <p>
Allereerst maken we een nieuwe klasse aan welke erft van System.Web.UI.WebControls.Xml.  
<br /><span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> XmlExtender
: System.Web.UI.WebControls.Xml</span></p>
        <p>
Op dit punt kunnen we exact hetzelfde dat het <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Xml
Control</span> kan. Vervolgens maken we een extra property TransformContent. 
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> TransformContent<br />
{<br />
  set<br />
  {<br />
    XslTransform xslTrans <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> XslTransform();<br />
    xslTrans.Load(XmlReader.Create(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> StringReader(value)));<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"> 
  this</span>.Transform <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> xslTrans;<br />
  }<br />
}</span>
        </p>
        <p>
De naam is zorgvuldig gekozen, er bestaat reeds een property DocumentContent welke
xml als string verwacht. TransformContent creeert een xslTransformer en leest de string
in. Vervolgens geef ik de de xslTransformer aan Property Transform van het Xml control
en heb ik exact de functionaliteit die ik wil hebben. Simpel maar doeltreffend. 
</p>
        <p>
Nu kunnen we het control gebruiken in een webapplicatie. Voor het testen van het control
heb ik een  demo site ontwikkeld wat een kleine lijst met boeken toont.  
</p>
        <p>
In default.aspx registreren we ons control<br /><br /><span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">&lt;%@
Register Assembly=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"XmlControlExtender"</span> Namespace=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"ControlExtenders"</span> TagPrefix=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"ext"</span> %&gt;<br /></span></p>
        <p>
Vervolgens plaatsen we het control op de pagina.
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">&lt;ext:XmlExtender
ID=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"xmlDemo"</span> runat=<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"server"</span> /&gt;</span>
        </p>
        <p>
In ons codebehind geven we de documentContent en de Transformcontent mee.
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">xmlDemo.DocumentContent <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetXml();<br />
xmlDemo.TransformContent <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> GetXslt();<br /></span>
        </p>
        <p>
GetXml geeft het xml document als string terug.
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> GetXml()<br />
{<br />
     StringBuilder s <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> StringBuilder();<br />
     s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;?xml
version=\"1.0\" encoding=\"utf-8\" ?&gt;"</span>);<br />
     s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;books&gt;"</span>);<br />
     s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;book&gt;&lt;title&gt;Programming
.Net Components&lt;/title&gt;&lt;author&gt;Juval L&amp;#246;wy&lt;/author&gt;&lt;/book&gt;"</span>);<br />
     s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;book&gt;&lt;title&gt;.Net
2.0 Generics&lt;/title&gt;&lt;author&gt;Tod Golding&lt;/author&gt;&lt;/book&gt;"</span>);<br />
     s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;book&gt;&lt;title&gt;Head
First Design Patterns&lt;/title&gt;&lt;author&gt;Freeman &amp;amp; Freeman&lt;/author&gt;&lt;/book&gt;"</span>);<br />
     s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;/books&gt;"</span>);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">    
return</span> s.ToString();<br />
}<br /></span>
        </p>
        <p>
GetXslt geeft de xslt als string terug.
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">private</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> GetXslt()<br />
{<br />
   StringBuilder s <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> StringBuilder();<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;?xml
version=\"1.0\" encoding=\"utf-8\"?&gt;&lt;xsl:stylesheet version=\"1.0\"  xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"&gt;"</span>);<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;xsl:template
match=\"/books\"&gt;"</span>);<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;html&gt;&lt;body&gt;"</span>);<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;xsl:for-each
select=\"book\"&gt;"</span>);<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Titel:
&lt;xsl:value-of select=\"title\"/&gt;&lt;br/&gt;"</span>);<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Auteur:
&lt;xsl:value-of select=\"author\"/&gt;&lt;br/&gt;&lt;br/&gt;"</span>);<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;/xsl:for-each&gt;"</span>);<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;/body&gt;&lt;/html&gt;"</span>);<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;/xsl:template&gt;"</span>);<br />
   s.Append(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"&lt;/xsl:stylesheet&gt;
"</span>);<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">  
return</span> s.ToString();<br />
}</span>
        </p>
        <p>
Na het starten van de webapplicatie wordt het XML document netjes opgemaakt door de
opgegeven stylesheet.
</p>
        <p align="center">
          <img src="http://www.richardsoeteman.net/content/binary/xmlcontrolextenderdemo.JPG" border="0" />
        </p>
        <p>
Met deze blogpost hoop ik aangetoond te hebben dat standaard Webcontrols zich makkelijk
laten uitbreiden en moedig een ieder zeker aan dit ook eens te doen. <br /><br />
XmlControlExtender is vrij te gebruiken in je eigen applicatie. Download <a href="http://www.richardsoeteman.net/downloads/webcontrols/xmlcontrolextender/xmlcontrolextender-source.zip" target="_new">de
Sourcecode </a>inclusief demo of alleen <a href="http://www.richardsoeteman.net/downloads/webcontrols/xmlcontrolextender/xmlcontrolextender.zip" target="_new">het
control</a>.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=6db2adbd-e4af-403f-92bb-2f03d4ed9a2b" />
      </body>
      <title>XmlControlExtender</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,6db2adbd-e4af-403f-92bb-2f03d4ed9a2b.aspx</guid>
      <link>http://www.richardsoeteman.net/2006/08/13/XmlControlExtender.aspx</link>
      <pubDate>Sun, 13 Aug 2006 13:15:38 GMT</pubDate>
      <description>&lt;p&gt;
Afgelopen week wilde ik het standaard Xml Control wilde gebruiken, echter was het
niet mogelijk XSLT direct als String door te geven, wat voor mijn toepassing wel nodig
was. Voor de rest doet het Xml Control exact wat ik wil, dus uitbreiden maar. 
&lt;/p&gt;
&lt;p&gt;
Allereerst maken we een nieuwe klasse aan welke erft van System.Web.UI.WebControls.Xml.&amp;nbsp; 
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; XmlExtender
: System.Web.UI.WebControls.Xml&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Op dit punt kunnen we exact hetzelfde dat het &lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Xml
Control&lt;/span&gt; kan. Vervolgens maken we een extra property TransformContent. 
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; TransformContent&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;set&lt;br&gt;
&amp;nbsp; {&lt;br&gt;
&amp;nbsp; &amp;nbsp; XslTransform xslTrans &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; XslTransform();&lt;br&gt;
&amp;nbsp; &amp;nbsp; xslTrans.Load(XmlReader.Create(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; StringReader(value)));&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;
&amp;nbsp; this&lt;/span&gt;.Transform &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; xslTrans;&lt;br&gt;
&amp;nbsp; }&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
De naam is zorgvuldig gekozen, er bestaat reeds een property DocumentContent welke
xml als string verwacht. TransformContent creeert een xslTransformer en leest de string
in. Vervolgens geef ik de de xslTransformer aan Property Transform van het Xml control
en heb ik exact de functionaliteit die ik wil hebben. Simpel maar doeltreffend. 
&lt;/p&gt;
&lt;p&gt;
Nu kunnen we het control gebruiken in een webapplicatie. Voor het testen van het control
heb ik een&amp;nbsp; demo site ontwikkeld wat een kleine lijst met boeken toont.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In default.aspx registreren we ons control&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;lt;%@
Register Assembly=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"XmlControlExtender"&lt;/span&gt; Namespace=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"ControlExtenders"&lt;/span&gt; TagPrefix=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"ext"&lt;/span&gt; %&amp;gt;&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Vervolgens plaatsen we het control op de pagina.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;lt;ext:XmlExtender
ID=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"xmlDemo"&lt;/span&gt; runat=&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"server"&lt;/span&gt; /&amp;gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
In ons codebehind geven we de documentContent en de Transformcontent mee.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;xmlDemo.DocumentContent &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetXml();&lt;br&gt;
xmlDemo.TransformContent &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; GetXslt();&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
GetXml geeft het xml document als string terug.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; GetXml()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; StringBuilder s &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; StringBuilder();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;?xml
version=\"1.0\" encoding=\"utf-8\" ?&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;books&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;book&amp;gt;&amp;lt;title&amp;gt;Programming
.Net Components&amp;lt;/title&amp;gt;&amp;lt;author&amp;gt;Juval L&amp;amp;#246;wy&amp;lt;/author&amp;gt;&amp;lt;/book&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;book&amp;gt;&amp;lt;title&amp;gt;.Net
2.0 Generics&amp;lt;/title&amp;gt;&amp;lt;author&amp;gt;Tod Golding&amp;lt;/author&amp;gt;&amp;lt;/book&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;book&amp;gt;&amp;lt;title&amp;gt;Head
First Design Patterns&amp;lt;/title&amp;gt;&amp;lt;author&amp;gt;Freeman &amp;amp;amp; Freeman&amp;lt;/author&amp;gt;&amp;lt;/book&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;/books&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
return&lt;/span&gt; s.ToString();&lt;br&gt;
}&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
GetXslt geeft de xslt als string terug.
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;private&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; GetXslt()&lt;br&gt;
{&lt;br&gt;
&amp;nbsp;&amp;nbsp; StringBuilder s &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; StringBuilder();&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;?xml
version=\"1.0\" encoding=\"utf-8\"?&amp;gt;&amp;lt;xsl:stylesheet version=\"1.0\"&amp;nbsp; xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;xsl:template
match=\"/books\"&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;xsl:for-each
select=\"book\"&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Titel:
&amp;lt;xsl:value-of select=\"title\"/&amp;gt;&amp;lt;br/&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Auteur:
&amp;lt;xsl:value-of select=\"author\"/&amp;gt;&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;/xsl:for-each&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;/xsl:template&amp;gt;"&lt;/span&gt;);&lt;br&gt;
&amp;nbsp;&amp;nbsp; s.Append(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"&amp;lt;/xsl:stylesheet&amp;gt;
"&lt;/span&gt;);&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&amp;nbsp;&amp;nbsp;
return&lt;/span&gt; s.ToString();&lt;br&gt;
}&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
Na het starten van de webapplicatie wordt het XML document netjes opgemaakt door de
opgegeven stylesheet.
&lt;/p&gt;
&lt;p align=center&gt;
&lt;img src="http://www.richardsoeteman.net/content/binary/xmlcontrolextenderdemo.JPG" border=0&gt;
&lt;/p&gt;
&lt;p&gt;
Met deze blogpost hoop ik aangetoond te hebben dat standaard Webcontrols zich makkelijk
laten uitbreiden en moedig een ieder zeker aan dit ook eens te doen.&amp;nbsp;&lt;br&gt;
&lt;br&gt;
XmlControlExtender is vrij te gebruiken in je eigen applicatie. Download&amp;nbsp;&lt;a href="http://www.richardsoeteman.net/downloads/webcontrols/xmlcontrolextender/xmlcontrolextender-source.zip" target=_new&gt;de
Sourcecode &lt;/a&gt;inclusief demo of alleen &lt;a href="http://www.richardsoeteman.net/downloads/webcontrols/xmlcontrolextender/xmlcontrolextender.zip" target=_new&gt;het
control&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=6db2adbd-e4af-403f-92bb-2f03d4ed9a2b" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,6db2adbd-e4af-403f-92bb-2f03d4ed9a2b.aspx</comments>
      <category>ASP.NET</category>
      <category>C#</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=ae3c90f3-bf47-4c1c-b1e4-8866b5ec4bff</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,ae3c90f3-bf47-4c1c-b1e4-8866b5ec4bff.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,ae3c90f3-bf47-4c1c-b1e4-8866b5ec4bff.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ae3c90f3-bf47-4c1c-b1e4-8866b5ec4bff</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Onlangs heb ik een project moeten migreren van .Net 1.1 naar .Net 2.0. Vele warnings
kreeg ik omdat klassen obsolete waren. Vandaag had ik het Xml Webcontrol nodig en
wilde daar dynamisch xslt aan meegeven. Hiervoor had ik de Transform property nodig,
welke een XslTransform object verwacht. Hey was deze niet obsolete? Raar dat je tijdens
een migratie eerst alle obsolete klassen moet vervangen en dan vervolgens  bij
de eerstvolgende toevoeging weer een obsolete klasse moet gebruiken. Ik weet wel dat
de warnings te omzeilen zijn maar ik vind het niet netjes van Microsoft ze hier geen
aandacht aan hebben geschonken.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ae3c90f3-bf47-4c1c-b1e4-8866b5ec4bff" />
      </body>
      <title>.Net 2.0 Xml.Transform property is obsolete</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,ae3c90f3-bf47-4c1c-b1e4-8866b5ec4bff.aspx</guid>
      <link>http://www.richardsoeteman.net/2006/08/11/Net20XmlTransformPropertyIsObsolete.aspx</link>
      <pubDate>Fri, 11 Aug 2006 21:25:39 GMT</pubDate>
      <description>&lt;p&gt;
Onlangs heb ik een project moeten migreren van .Net 1.1 naar&amp;nbsp;.Net 2.0. Vele warnings
kreeg ik omdat klassen obsolete waren. Vandaag had ik het Xml Webcontrol nodig en
wilde daar dynamisch xslt aan meegeven. Hiervoor had ik de Transform property nodig,
welke een XslTransform object verwacht. Hey was deze niet obsolete? Raar dat je tijdens
een migratie eerst alle obsolete klassen moet vervangen en dan vervolgens&amp;nbsp; bij
de eerstvolgende toevoeging weer een obsolete klasse moet gebruiken. Ik weet wel dat
de warnings te omzeilen zijn maar ik vind het niet netjes van Microsoft ze hier geen
aandacht aan hebben geschonken.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ae3c90f3-bf47-4c1c-b1e4-8866b5ec4bff" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,ae3c90f3-bf47-4c1c-b1e4-8866b5ec4bff.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=d604535a-7b28-4d84-8077-2f2ce787767e</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,d604535a-7b28-4d84-8077-2f2ce787767e.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,d604535a-7b28-4d84-8077-2f2ce787767e.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=d604535a-7b28-4d84-8077-2f2ce787767e</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Regelmatig spreek ik ASP.Net ontwikkelaars. Vaak vraag ik hen of ze wel eens gebruik
maken van Atlas, het Ajax Framework van Microsoft. De meest gehoorde antwoorden zijn;
“ja”, “duurt lang om te implementeren” , “maar dat is toch nog niet officieel uit?”
“ransig met Javascript”, “ransig met dat XML script”. Op antwoord twee wil ik me voor
nu even concentreren. 
</p>
        <p>
Via onderstaande ASP.Net applicatie kan een gebruiker zijn/haar naam invoeren en na
een druk op de submit knop wordt de invoer getoond, lijkt mij een wereld applicatie
:-). 
</p>
        <p>
Onderstaand de source:<br /><br />
HTML:<br /><br />
&lt;%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" 
<br />
Inherits="_Default" %&gt;<br />
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
<br />
"<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>"&gt;
</p>
        <p>
&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml" target="_new">http://www.w3.org/1999/xhtml</a>"
&gt;<br />
&lt;head runat="server"&gt;<br />
    &lt;title&gt;Een webapplicatie&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
    &lt;form id="wepappForm" runat="server" defaultbutton="submit"&gt;<br />
    &lt;div&gt;<br />
        &lt;asp:Label ID="applicatieInfo" runat="server"
Text="" /&gt;<br />
        &lt;br /&gt; &lt;br /&gt;<br />
        &lt;asp:Label ID="yourName" runat="server"
Text="Naam:" /&gt;<br />
        &lt;asp:TextBox ID="nameField" runat="server"
/&gt;<br />
        &lt;asp:Button ID="submit" runat="server"
Text="Submit" OnClick="submit_Click" /&gt;<br />
        &lt;br /&gt;&lt;br /&gt;<br />
        &lt;asp:Label ID="typedValue" runat="server"
Font-Bold="True" Font-Size="Large" /&gt;<br />
        &lt;/div&gt;<br />
    &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br /><br />
C# CodeBehind :<br /><span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Configuration;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web.UI;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web.UI.WebControls;<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">using</span> System.Web.UI.HtmlControls;<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span> partial <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> _Default
: System.Web.UI.Page 
<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">protected</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> Page_Load(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">this</span>.applicatieInfo.Text <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span>.Format(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Datum:
{0} "</span>, DateTime.Now);<br />
}<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">protected</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">void</span> submit_Click(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">object</span> sender,
EventArgs e)<br />
{<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">this</span>.typedValue.Text <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span>.Format(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"Uw
naam is {0}"</span>,<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">this</span>.nameField.Text);<br />
}<br />
}<br /><br /></span>Wanneer de applicatie wordt gestart wordt bij elke submit de pagina compleet
ververst, zie de tijdsindicatie.
</p>
        <p align="center">
          <img src="http://www.richardsoeteman.net/content/binary/startwithoutatlas.jpg" border="0" />
          <br />
          <br />
Applicatie gestart zonder Atlas functionaliteit<br /><br /><br /><img src="http://www.richardsoeteman.net/content/binary/submitwithoutatlas.jpg" border="0" /><br /><br />
Submit zonder Atlas functionaliteit
</p>
        <p>
          <br />
Wat je eigenlijk zou willen is dat alleen het formulier wordt ververst en niet de
gehele pagina. Met Atlas is dit binnen 5 minuten te realiseren. Allereerst <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=81BF1390-7894-4FF7-B591-1006BD770BC0&amp;displaylang=en" target="_new">downloaden</a> en
installeren we de nieuwste versie van het Atlas Framework.  
</p>
        <p>
Vervolgens kopiëren we de Microsoft.Web.Atlas.dll naar de bin folder van onze applicatie
en maken een referentie naar deze DLL.  Deze DLL is te vinden in \Mijn documenten\Visual
Studio 2005\Templates\ProjectTemplates\Visual Web Developer\CSharp\ASPNETAtlasWebApplicationCS.zip
voor cSharp developers, of Mijn documenten\Visual Studio 2005\Templates\ProjectTemplates\Visual
Web Developer\VisualBasic\ASPNETAtlasWebApplicationVB.zip voor de Visual Basic variant.
</p>
        <p>
Voeg aan je system.web sectie van je web.config onderstaande elementen toe
</p>
        <p>
     &lt;pages&gt;<br />
      &lt;controls&gt;<br />
        &lt;add namespace="Microsoft.Web.UI" assembly="Microsoft.Web.Atlas"
tagPrefix="atlas"/&gt;<br />
        &lt;add namespace="Microsoft.Web.UI.Controls"
assembly="Microsoft.Web.Atlas" tagPrefix="atlas"/&gt;<br />
      &lt;/controls&gt;<br />
    &lt;/pages&gt;
</p>
        <p>
Dit zijn overigens de minimaal benodigde instellingen. <a href="http://www.richardsoeteman.net/content/binary/Web.config.txt" target="_new">Download
hier</a> een volledig voorgeconfigureerde web.config. 
</p>
        <p>
Aan de HTML Source voeg ik een Scriptmanager en een Updatepanel toe(in Bold en Italic
weergegeven). 
</p>
        <p>
&lt;%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" 
<br />
Inherits="_Default" %&gt;
</p>
        <p>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
<br />
"<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>"&gt;
</p>
        <p>
&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml" target="_new">http://www.w3.org/1999/xhtml</a>"
&gt;<br />
&lt;head runat="server"&gt;<br />
    &lt;title&gt;Een webapplicatie&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
    &lt;form id="wepappForm" runat="server" defaultbutton="submit"&gt;<br />
&lt;atlas:ScriptManager  runat="server" ID="scriptMngr" EnablePartialRendering="true"
/&gt;  
<br />
    &lt;div&gt;<br />
        &lt;asp:Label ID="applicatieInfo" runat="server"
Text="" /&gt;<br />
        &lt;br /&gt; &lt;br /&gt;<br />
        &lt;atlas:UpdatePanel ID="updName" runat="server"&gt;<br />
        &lt;ContentTemplate&gt;<br />
            &lt;asp:Label ID="yourName"
runat="server" Text="Naam:" /&gt;<br />
            &lt;asp:TextBox
ID="nameField" runat="server" /&gt;<br />
            &lt;asp:Button
ID="submit" runat="server" Text="Submit" OnClick="submit_Click" /&gt;<br />
            &lt;br /&gt;&lt;br
/&gt;<br />
            &lt;asp:Label ID="typedValue"
runat="server" Font-Bold="True" Font-Size="Large" /&gt;<br />
        &lt;/ContentTemplate&gt;<br />
        &lt;Triggers&gt;<br />
        &lt;atlas:ControlEventTrigger ControlID="submit"
EventName="Click" /&gt;<br />
        &lt;/Triggers&gt;<br />
        &lt;/atlas:UpdatePanel&gt;<br />
     &lt;/div&gt;<br />
    &lt;/form&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;
</p>
        <p>
In een latere blogpost kom ik nog gedetailleerder op de Scriptmanager en Updatepanel
terug, maar voor nu is het voldoende om te weten dat de scriptmanager verantwoordelijk
is voor de communicatie tussen Atlas controls en code behind files. Het Update
panel is verantwoordelijk voor het verversen van de controls die binnen het ContentTemplate
element vallen en het doorsluizen van events die binnen het triggers element vallen.  
</p>
        <p>
In ons geval wordt na het drukken op de submit knop Event Click afgevangen, de postback
wordt uitgevoerd en het formulier wordt ververst. Nu starten we onze webapplicatie
met Atlas functionaliteit<br /><br /></p>
        <p align="center">
          <img src="http://www.richardsoeteman.net/content/binary/startwithatlas.JPG" border="0" />
          <br />
          <br />
Applicatie gestart met Atlas functionaliteit 
<br /><br /><br /><img src="http://www.richardsoeteman.net/content/binary/submitwithatlas.JPG" border="0" /> <br /><br />
Submit met Atlas functionaliteit 
</p>
Constateer dat de datum/tijd dit keer niet veranderd omdat deze buiten het update
panel is geplaatst en dus niet ververst wordt. Ook heb ik niks aan mijn codebehind
file hoeven aan te passen. Uiteraard is dit slechts basis functionaliteit, maar in
een volgende blogpost over Atlas zal ik dieper ingaan op het Framework. 
<br /><br /><strong>Downloads:<br /></strong><ul><li><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=81BF1390-7894-4FF7-B591-1006BD770BC0&amp;displaylang=en" target="_new">Atlas
Juni 2006 CTP.</a> Atlas is nog niet officieel uit, maar er is een go live licentie,
dus je mag het in een productieomgeving gebruiken. 
</li><li><a href="http://www.richardsoeteman.net/content/binary/withoutatlas.zip">Source zonder
Atlas functionaliteit</a></li><li><a href="http://www.richardsoeteman.net/content/binary/withatlas.zip">Source met 
Atlas functionaliteit.</a> De Atlas dll mag ik niet meeleveren volgens de licentie,
dus die moet je zelf nog even plaatsen. 
</li><li><a href="http://www.richardsoeteman.net/content/binary/Web.config.txt" target="_new">Atlas
Web.Config</a></li></ul><img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=d604535a-7b28-4d84-8077-2f2ce787767e" /></body>
      <title>Geef je ASP.Net applicatie een Atlas boost</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,d604535a-7b28-4d84-8077-2f2ce787767e.aspx</guid>
      <link>http://www.richardsoeteman.net/2006/07/30/GeefJeASPNetApplicatieEenAtlasBoost.aspx</link>
      <pubDate>Sun, 30 Jul 2006 15:21:32 GMT</pubDate>
      <description>&lt;p&gt;
Regelmatig spreek ik ASP.Net ontwikkelaars. Vaak vraag ik hen of ze wel eens gebruik
maken van Atlas, het Ajax Framework van Microsoft. De meest gehoorde antwoorden zijn;
“ja”, “duurt lang om te implementeren” , “maar dat is toch nog niet officieel uit?”
“ransig met Javascript”, “ransig met dat XML script”. Op antwoord twee wil ik me voor
nu even concentreren. 
&lt;/p&gt;
&lt;p&gt;
Via onderstaande ASP.Net applicatie kan een gebruiker zijn/haar naam invoeren en na
een druk op de submit knop wordt de invoer getoond, lijkt mij een wereld applicatie
:-). 
&lt;/p&gt;
&lt;p&gt;
Onderstaand de source:&lt;br&gt;
&lt;br&gt;
HTML:&lt;br&gt;
&lt;br&gt;
&amp;lt;%@ Page Language="C#" AutoEventWireup="true"&amp;nbsp; CodeFile="Default.aspx.cs" 
&lt;br&gt;
Inherits="_Default" %&amp;gt;&lt;br&gt;
&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
&lt;br&gt;
"&lt;a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/a&gt;"&amp;gt;
&lt;/p&gt;
&lt;p&gt;
&amp;lt;html xmlns="&lt;a href="http://www.w3.org/1999/xhtml" target=_new&gt;http://www.w3.org/1999/xhtml&lt;/a&gt;"
&amp;gt;&lt;br&gt;
&amp;lt;head runat="server"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Een webapplicatie&amp;lt;/title&amp;gt;&lt;br&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="wepappForm" runat="server" defaultbutton="submit"&amp;gt;&lt;br&gt;
&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;lt;asp:Label ID="applicatieInfo" runat="server"
Text="" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID="yourName" runat="server"
Text="Naam:" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:TextBox ID="nameField" runat="server"
/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Button ID="submit" runat="server"
Text="Submit" OnClick="submit_Click" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;asp:Label ID="typedValue" runat="server"
Font-Bold="True" Font-Size="Large" /&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;br&gt;
&lt;br&gt;
C# CodeBehind :&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Configuration;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web.UI;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web.UI.WebControls;&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;using&lt;/span&gt; System.Web.UI.HtmlControls;&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; partial &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; _Default
: System.Web.UI.Page 
&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;protected&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; Page_Load(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;this&lt;/span&gt;.applicatieInfo.Text &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;.Format(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Datum:
{0} "&lt;/span&gt;, DateTime.Now);&lt;br&gt;
}&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;protected&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;void&lt;/span&gt; submit_Click(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;object&lt;/span&gt; sender,
EventArgs e)&lt;br&gt;
{&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;this&lt;/span&gt;.typedValue.Text &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt;.Format(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"Uw
naam is {0}"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;this&lt;/span&gt;.nameField.Text);&lt;br&gt;
}&lt;br&gt;
}&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;Wanneer de applicatie wordt gestart wordt bij elke submit de pagina compleet
ververst, zie de tijdsindicatie.
&lt;/p&gt;
&lt;p align=center&gt;
&lt;img src="http://www.richardsoeteman.net/content/binary/startwithoutatlas.jpg" border=0&gt;
&lt;br&gt;
&lt;br&gt;
Applicatie gestart zonder Atlas functionaliteit&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;img src="http://www.richardsoeteman.net/content/binary/submitwithoutatlas.jpg" border=0&gt;
&lt;br&gt;
&lt;br&gt;
Submit zonder Atlas functionaliteit
&lt;/p&gt;
&lt;p&gt;
&lt;br&gt;
Wat je eigenlijk zou willen is dat alleen het formulier wordt ververst en niet de
gehele pagina. Met Atlas is dit binnen 5 minuten te realiseren. Allereerst &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=81BF1390-7894-4FF7-B591-1006BD770BC0&amp;amp;displaylang=en" target=_new&gt;downloaden&lt;/a&gt; en
installeren we de nieuwste versie van het Atlas Framework.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Vervolgens kopiëren we de Microsoft.Web.Atlas.dll naar de bin folder van onze applicatie
en maken een referentie naar deze DLL.&amp;nbsp; Deze DLL is te vinden in \Mijn documenten\Visual
Studio 2005\Templates\ProjectTemplates\Visual Web Developer\CSharp\ASPNETAtlasWebApplicationCS.zip
voor cSharp developers, of Mijn documenten\Visual Studio 2005\Templates\ProjectTemplates\Visual
Web Developer\VisualBasic\ASPNETAtlasWebApplicationVB.zip voor de Visual Basic variant.
&lt;/p&gt;
&lt;p&gt;
Voeg aan je system.web sectie van je web.config onderstaande elementen toe
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;pages&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;controls&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add namespace="Microsoft.Web.UI" assembly="Microsoft.Web.Atlas"
tagPrefix="atlas"/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;add namespace="Microsoft.Web.UI.Controls"
assembly="Microsoft.Web.Atlas" tagPrefix="atlas"/&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/controls&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/pages&amp;gt;
&lt;/p&gt;
&lt;p&gt;
Dit zijn overigens de minimaal benodigde instellingen. &lt;a href="http://www.richardsoeteman.net/content/binary/Web.config.txt" target=_new&gt;Download
hier&lt;/a&gt; een volledig voorgeconfigureerde web.config. 
&lt;/p&gt;
&lt;p&gt;
Aan de HTML Source voeg ik een Scriptmanager en een Updatepanel toe(in Bold en Italic
weergegeven). 
&lt;/p&gt;
&lt;p&gt;
&amp;lt;%@ Page Language="C#" AutoEventWireup="true"&amp;nbsp; CodeFile="Default.aspx.cs" 
&lt;br&gt;
Inherits="_Default" %&amp;gt;
&lt;/p&gt;
&lt;p&gt;
&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
&lt;br&gt;
"&lt;a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/a&gt;"&amp;gt;
&lt;/p&gt;
&lt;p&gt;
&amp;lt;html xmlns="&lt;a href="http://www.w3.org/1999/xhtml" target=_new&gt;http://www.w3.org/1999/xhtml&lt;/a&gt;"
&amp;gt;&lt;br&gt;
&amp;lt;head runat="server"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;title&amp;gt;Een webapplicatie&amp;lt;/title&amp;gt;&lt;br&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="wepappForm" runat="server" defaultbutton="submit"&amp;gt;&lt;br&gt;
&amp;lt;atlas:ScriptManager&amp;nbsp; runat="server" ID="scriptMngr" EnablePartialRendering="true"
/&amp;gt;&amp;nbsp; 
&lt;br&gt;
&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;lt;asp:Label ID="applicatieInfo" runat="server"
Text="" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;br /&amp;gt; &amp;lt;br /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;atlas:UpdatePanel ID="updName" runat="server"&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ContentTemplate&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;asp:Label ID="yourName"
runat="server" Text="Naam:" /&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;asp:TextBox
ID="nameField" runat="server" /&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;asp:Button
ID="submit" runat="server" Text="Submit" OnClick="submit_Click" /&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;br /&amp;gt;&amp;lt;br
/&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;asp:Label ID="typedValue"
runat="server" Font-Bold="True" Font-Size="Large" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ContentTemplate&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Triggers&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;atlas:ControlEventTrigger ControlID="submit"
EventName="Click" /&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Triggers&amp;gt;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/atlas:UpdatePanel&amp;gt;&lt;br&gt;
&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&gt;
In een latere blogpost kom ik nog gedetailleerder op de Scriptmanager en Updatepanel
terug, maar voor nu is het voldoende om te weten dat de scriptmanager verantwoordelijk
is voor de communicatie tussen Atlas controls en code behind files.&amp;nbsp;Het Update
panel is verantwoordelijk voor het verversen van de controls die binnen het ContentTemplate
element vallen en het doorsluizen van events die binnen het triggers element vallen.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
In ons geval wordt na het drukken op de submit knop Event Click afgevangen, de postback
wordt uitgevoerd en het formulier wordt ververst. Nu starten we onze webapplicatie
met Atlas functionaliteit&lt;br&gt;
&lt;br&gt;
&lt;/p&gt;
&lt;p align=center&gt;
&lt;img src="http://www.richardsoeteman.net/content/binary/startwithatlas.JPG" border=0&gt;
&lt;br&gt;
&lt;br&gt;
Applicatie gestart met Atlas functionaliteit 
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;img src="http://www.richardsoeteman.net/content/binary/submitwithatlas.JPG" border=0&gt;&amp;nbsp;&lt;br&gt;
&lt;br&gt;
Submit met Atlas functionaliteit 
&lt;/p&gt;
Constateer dat de datum/tijd dit keer niet veranderd omdat deze buiten het update
panel is geplaatst en dus niet ververst wordt. Ook heb ik niks aan mijn codebehind
file hoeven aan te passen. Uiteraard is dit slechts basis functionaliteit, maar in
een volgende blogpost over Atlas zal ik dieper ingaan op het Framework. 
&lt;br&gt;
&lt;br&gt;
&lt;strong&gt;Downloads:&lt;br&gt;
&lt;/strong&gt; 
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=81BF1390-7894-4FF7-B591-1006BD770BC0&amp;amp;displaylang=en" target=_new&gt;Atlas
Juni 2006 CTP.&lt;/a&gt; Atlas is nog niet officieel uit, maar er is een go live licentie,
dus je mag het in een productieomgeving gebruiken. 
&lt;li&gt;
&lt;a href="http://www.richardsoeteman.net/content/binary/withoutatlas.zip"&gt;Source zonder
Atlas functionaliteit&lt;/a&gt; 
&lt;li&gt;
&lt;a href="http://www.richardsoeteman.net/content/binary/withatlas.zip"&gt;Source met&amp;nbsp;
Atlas functionaliteit.&lt;/a&gt; De Atlas dll mag ik niet meeleveren volgens de licentie,
dus die moet je zelf nog even plaatsen. 
&lt;li&gt;
&lt;a href="http://www.richardsoeteman.net/content/binary/Web.config.txt" target=_new&gt;Atlas
Web.Config&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=d604535a-7b28-4d84-8077-2f2ce787767e" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,d604535a-7b28-4d84-8077-2f2ce787767e.aspx</comments>
      <category>ASP.NET</category>
      <category>Atlas</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=6e8cbb76-bc93-4d30-a45e-9902b62394a0</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,6e8cbb76-bc93-4d30-a45e-9902b62394a0.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,6e8cbb76-bc93-4d30-a45e-9902b62394a0.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=6e8cbb76-bc93-4d30-a45e-9902b62394a0</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Afgelopen week liep ik tegen een probleem
aan waarbij authenticatie timeout minuten eerder optrad dan sessie timeout, terwijl
beide op 20 minuten stonden ingesteld. De oorzaak was een verschil tussen de werking
van sessie timeout en authenticatie timeout. 
<p></p><p>
Sessie timeout wordt elke keer vernieuwd wanneer een pagina wordt opgevraagd. Dus
wanneer je in je web.config aangeeft dat de sessie na 20 minuten verloopt, zal deze
elke keer dat een pagina wordt opgevraagd 20 minuten na nu worden gezet(wat logisch
is). Authenticatie timeout wordt pas vernieuwd wanneer 50% van de resterende tijd
verstreken is. Dus wanneer je de authenticatie timeout dezelfde waarde geeft als sessie
timeout zal deze de eerste 10 minuten niet vernieuwd worden. Even terug naar de pagina
waar een gebruiker inlogt om 8:00. De volgende waarden worden gezet:
</p><p>
Sessie Timeout = 8:20<br />
Authenticatie Timeout = 8:20
</p><p>
Vervolgens doet de gebruiker na 8 minuten weer een actie. De volgende waarden worden
gezet:
</p><p>
Sessie Timeout = 8:28<br />
Authenticatie Timeout = 8:20
</p><p>
Om 8:25 vraagt de gebruiker een pagina op en wordt naar de loginpagina verwezen omdat
er een authenticatie timeout is opgetreden. Het menu wordt echter opgebouwd aan de
hand van een sessie variabele.  Deze variabele bestaat nog steeds en toont dus
het verkeerde menu. Ik heb dit opgelost door authenticatie timeout drie keer hoger
te zetten dan sessie timeout. 
</p><p>
In het Session_OnStart event van het global.asax bestand log ik middels onderstaande
regel de gebruiker automatisch uit wanneer een nieuwe sessie wordt gestart(zelfs als
deze niet is ingelogd).
</p><p>
FormsAuthentication.SignOut()
</p><p>
De reden waarom ik dit in het Session_OnStart event heb geplaatst is dat het Session_OnEnd
event niet altijd getriggerd wordt en op deze manier weet ik zeker dat een gebruiker
niet is ingelogd wanneer een sessie start.
</p><img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=6e8cbb76-bc93-4d30-a45e-9902b62394a0" /></body>
      <title>Session Timeout vs Forms Authentication Timeout.</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,6e8cbb76-bc93-4d30-a45e-9902b62394a0.aspx</guid>
      <link>http://www.richardsoeteman.net/2006/01/23/SessionTimeoutVsFormsAuthenticationTimeout.aspx</link>
      <pubDate>Mon, 23 Jan 2006 20:19:16 GMT</pubDate>
      <description>Afgelopen week liep ik tegen een probleem aan waarbij authenticatie timeout minuten eerder optrad dan sessie timeout, terwijl beide op 20 minuten stonden ingesteld. De oorzaak was een verschil tussen de werking van sessie timeout en authenticatie timeout. 
&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
Sessie timeout wordt elke keer vernieuwd wanneer een pagina wordt opgevraagd. Dus
wanneer je in je web.config aangeeft dat de sessie na 20 minuten verloopt, zal deze
elke keer dat een pagina wordt opgevraagd 20 minuten na nu worden gezet(wat logisch
is). Authenticatie timeout wordt pas vernieuwd wanneer 50% van de resterende tijd
verstreken is. Dus wanneer je de authenticatie timeout dezelfde waarde geeft als sessie
timeout zal deze de eerste 10 minuten niet vernieuwd worden. Even terug naar de pagina
waar een gebruiker inlogt om 8:00. De volgende waarden worden gezet:
&lt;/p&gt;
&lt;p&gt;
Sessie Timeout = 8:20&lt;br&gt;
Authenticatie Timeout = 8:20
&lt;/p&gt;
&lt;p&gt;
Vervolgens doet de gebruiker na 8 minuten weer een actie. De volgende waarden worden
gezet:
&lt;/p&gt;
&lt;p&gt;
Sessie Timeout = 8:28&lt;br&gt;
Authenticatie Timeout = 8:20
&lt;/p&gt;
&lt;p&gt;
Om 8:25 vraagt de gebruiker een pagina op en wordt naar de loginpagina verwezen omdat
er een authenticatie timeout is opgetreden. Het menu wordt echter opgebouwd aan de
hand van een sessie variabele.&amp;nbsp; Deze variabele bestaat nog steeds en toont dus
het verkeerde menu. Ik heb dit opgelost door authenticatie timeout drie keer hoger
te zetten dan sessie timeout. 
&lt;/p&gt;
&lt;p&gt;
In het Session_OnStart event van het global.asax bestand log ik middels onderstaande
regel de gebruiker automatisch uit wanneer een nieuwe sessie wordt gestart(zelfs als
deze niet is ingelogd).
&lt;/p&gt;
&lt;p&gt;
FormsAuthentication.SignOut()
&lt;/p&gt;
&lt;p&gt;
De reden waarom ik dit in het Session_OnStart event heb geplaatst is dat het Session_OnEnd
event niet altijd getriggerd wordt en op deze manier weet ik zeker dat een gebruiker
niet is ingelogd wanneer een sessie start.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=6e8cbb76-bc93-4d30-a45e-9902b62394a0" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,6e8cbb76-bc93-4d30-a45e-9902b62394a0.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=3d76fa49-38f3-4763-b82e-2b5c25b03642</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,3d76fa49-38f3-4763-b82e-2b5c25b03642.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,3d76fa49-38f3-4763-b82e-2b5c25b03642.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3d76fa49-38f3-4763-b82e-2b5c25b03642</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Via onderstaande link word je uitgelegd hoe je een website project vanuit windows
explorer kan starten. Erg handig.
</p>
        <p>
          <a href="http://weblogs.asp.net/bradleyb/archive/2005/12/09/432802.aspx" target="_new">Lees
meer</a>
        </p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=3d76fa49-38f3-4763-b82e-2b5c25b03642" />
      </body>
      <title>Open VS2005 website project vanuit Windows Explorer</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,3d76fa49-38f3-4763-b82e-2b5c25b03642.aspx</guid>
      <link>http://www.richardsoeteman.net/2005/12/11/OpenVS2005WebsiteProjectVanuitWindowsExplorer.aspx</link>
      <pubDate>Sun, 11 Dec 2005 08:52:15 GMT</pubDate>
      <description>&lt;p&gt;
Via onderstaande link word je uitgelegd hoe je een website project vanuit&amp;nbsp;windows
explorer&amp;nbsp;kan starten. Erg handig.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://weblogs.asp.net/bradleyb/archive/2005/12/09/432802.aspx" target=_new&gt;Lees
meer&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=3d76fa49-38f3-4763-b82e-2b5c25b03642" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,3d76fa49-38f3-4763-b82e-2b5c25b03642.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=b94932ce-d069-420f-ae93-9ff50fe67bab</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,b94932ce-d069-420f-ae93-9ff50fe67bab.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,b94932ce-d069-420f-ae93-9ff50fe67bab.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=b94932ce-d069-420f-ae93-9ff50fe67bab</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Om een website te compileren en te deployen in ASP.Net 1.x was een build, copy van
ASPX files en de bin directory voldoende. ASP.Net 2.0 maakt geen gebruik meer
van dit mechanisme. ASP.Net 2.0 compileerd de bestanden on the fly en maakt van elk
codebehind file een kleine DLL wanneer een gebruiker een pagina van de website opvraagt. Dit
houdt in dat Codebehind files ook op de server geplaatst moeten worden, iets dat we
absoluut niet willen. Daarom is een command line tool beschikbaar waarmee de
website volledig gecompileerd wordt.  Deze command line tool heet aspnet_compiler.exe.
</p>
        <p>
Via onderstaand commando heb ik ons eerste .Net 2.0 project succesvol gecompileerd.  
<br />
aspnet_compiler -p e:\Inetpub\tom-du.net\Framework c:\compiled -v tomdu.
</p>
        <p>
-p staat voor physieke locatie op schijf<br />
e:\Inetpub\tom-du.net\Framework is de locatie van de sources<br />
c:\Compiled is de target folder<br />
-v staat voor virtuele folder (in ons geval tomdu)
</p>
        <p>
In bovenstaand voorbeeld wordt code <u>en</u> layout gecompileerd in Dll's. In de
aspx vind je alleen "This is a marker file generated by the precompilation tool, and
should not be deleted!". Mocht je de aspx file wel willen wijzigen zonder opnieuw
te compileren kan je de optie -u gebruiken.  
</p>
        <p>
Om nu niet teveel te typen kan je via <a href="http://www.west-wind.com/tools/aspnetcompiler.asp" target="_new">www.west-wind.com</a> is
een gratis tool downloaden wat beschikt over een GUI.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=b94932ce-d069-420f-ae93-9ff50fe67bab" />
      </body>
      <title>Asp.Net 2.0 precompilation Tool</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,b94932ce-d069-420f-ae93-9ff50fe67bab.aspx</guid>
      <link>http://www.richardsoeteman.net/2005/10/19/AspNet20PrecompilationTool.aspx</link>
      <pubDate>Wed, 19 Oct 2005 15:59:46 GMT</pubDate>
      <description>&lt;p&gt;
Om een website te compileren en te deployen in ASP.Net 1.x was een build, copy van
ASPX files en de&amp;nbsp;bin directory voldoende. ASP.Net 2.0 maakt geen gebruik meer
van dit mechanisme. ASP.Net 2.0 compileerd de bestanden on the fly en maakt van elk
codebehind file een kleine DLL wanneer een gebruiker een pagina van de website opvraagt.&amp;nbsp;Dit
houdt in dat Codebehind files ook op de server geplaatst moeten worden, iets dat we
absoluut niet willen.&amp;nbsp;Daarom is een command line tool beschikbaar waarmee de
website&amp;nbsp;volledig gecompileerd wordt.&amp;nbsp;&amp;nbsp;Deze command line tool heet aspnet_compiler.exe.
&lt;/p&gt;
&lt;p&gt;
Via onderstaand commando heb ik ons eerste .Net 2.0 project succesvol gecompileerd.&amp;nbsp; 
&lt;br&gt;
aspnet_compiler -p e:\Inetpub\tom-du.net\Framework c:\compiled -v tomdu.
&lt;/p&gt;
&lt;p&gt;
-p staat voor physieke locatie op schijf&lt;br&gt;
e:\Inetpub\tom-du.net\Framework is de locatie van de sources&lt;br&gt;
c:\Compiled is de target folder&lt;br&gt;
-v staat voor virtuele folder (in ons geval tomdu)
&lt;/p&gt;
&lt;p&gt;
In bovenstaand voorbeeld wordt code &lt;u&gt;en&lt;/u&gt; layout gecompileerd in Dll's. In de
aspx vind je alleen "This is a marker file generated by the precompilation tool, and
should not be deleted!". Mocht je de aspx file wel willen&amp;nbsp;wijzigen zonder opnieuw
te compileren kan je de optie -u gebruiken. &amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
Om nu niet teveel te typen kan je via &lt;a href="http://www.west-wind.com/tools/aspnetcompiler.asp" target=_new&gt;www.west-wind.com&lt;/a&gt;&amp;nbsp;is
een gratis tool downloaden wat beschikt over een GUI.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=b94932ce-d069-420f-ae93-9ff50fe67bab" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,b94932ce-d069-420f-ae93-9ff50fe67bab.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=a2a2adda-fc7f-44a7-99f7-35a8ff383f90</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,a2a2adda-fc7f-44a7-99f7-35a8ff383f90.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,a2a2adda-fc7f-44a7-99f7-35a8ff383f90.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=a2a2adda-fc7f-44a7-99f7-35a8ff383f90</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
De Ajax.Net Library is vernieuwd, nieuwe features:
</p>
        <ul>
          <li>
Enums in JavaScript client-side code 
</li>
          <li>
DateTime, Date en Timezone functies 
</li>
          <li>
Session State Handlers</li>
        </ul>
        <p>
          <a href="http://ajaxpro.schwarz-interactive.de/" target="_new">Meer Info</a>
        </p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=a2a2adda-fc7f-44a7-99f7-35a8ff383f90" />
      </body>
      <title>Ajax.NET Professional</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,a2a2adda-fc7f-44a7-99f7-35a8ff383f90.aspx</guid>
      <link>http://www.richardsoeteman.net/2005/10/14/AjaxNETProfessional.aspx</link>
      <pubDate>Fri, 14 Oct 2005 08:14:43 GMT</pubDate>
      <description>&lt;p&gt;
De Ajax.Net Library is vernieuwd, nieuwe features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Enums&amp;nbsp;in JavaScript client-side code 
&lt;li&gt;
DateTime, Date en Timezone functies 
&lt;li&gt;
Session State Handlers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;a href="http://ajaxpro.schwarz-interactive.de/" target=_new&gt;Meer Info&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=a2a2adda-fc7f-44a7-99f7-35a8ff383f90" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,a2a2adda-fc7f-44a7-99f7-35a8ff383f90.aspx</comments>
      <category>ASP.NET</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=50c7ed20-5cf5-4b5b-8e2a-99a2289c0c4d</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,50c7ed20-5cf5-4b5b-8e2a-99a2289c0c4d.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,50c7ed20-5cf5-4b5b-8e2a-99a2289c0c4d.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=50c7ed20-5cf5-4b5b-8e2a-99a2289c0c4d</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Gisteren liep ik in Visual studio 2005 tegen het volgende probleem aan:<br /><br />
- Plaats een Login control (uiLogin)op de pagina.<br />
- Plaats Password Required tekst in <em>PasswordRequiredErrorMessage</em>.<br />
- Plaats Username Required tekst in <em>UserNameRequiredErrorMessage</em>.<br />
- Plaats een validationsummary control (uiValid) op de pagina.<br />
- plaats in uiValid.ValidationGroup het Id van uiLogin. 
<br /><br />
Volgens MSDN zou het validationsummary control nu de Password Required tekst en Username
Required tekst kunnen tonen.<br /><br />
Door een bug in het validationsummary control is dit echter niet het geval. Een workaround
is door in uiValid.ValidationGroup het unieke ID van uiLogin te plaatsen, dit kan
alleen in code. Na het toevoegen van onderstaande c# regel aan het Page_Load event
is uiValid in staat de Password Required tekst en Username Required tekst te tonen.<br /><span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><br />
uiValid.ValidationGroup <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> uiLogin.UniqueID; 
<br /></span><br />
Klik <a href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=29876470-1cbd-4a2c-ac4b-8de868a401ee" target="_new">hier</a> voor
meer info over deze bug en mijn geposte workaround.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=50c7ed20-5cf5-4b5b-8e2a-99a2289c0c4d" />
      </body>
      <title>Login control en validation summary control bug .NET 2.0</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,50c7ed20-5cf5-4b5b-8e2a-99a2289c0c4d.aspx</guid>
      <link>http://www.richardsoeteman.net/2005/07/22/LoginControlEnValidationSummaryControlBugNET20.aspx</link>
      <pubDate>Fri, 22 Jul 2005 12:16:18 GMT</pubDate>
      <description>&lt;p&gt;
Gisteren liep ik in Visual studio 2005 tegen het volgende probleem aan:&lt;br&gt;
&lt;br&gt;
- Plaats een Login control (uiLogin)op de pagina.&lt;br&gt;
- Plaats Password Required tekst in &lt;em&gt;PasswordRequiredErrorMessage&lt;/em&gt;.&lt;br&gt;
- Plaats Username Required tekst in &lt;em&gt;UserNameRequiredErrorMessage&lt;/em&gt;.&lt;br&gt;
- Plaats een validationsummary control (uiValid) op de pagina.&lt;br&gt;
- plaats in uiValid.ValidationGroup het Id van uiLogin. 
&lt;br&gt;
&lt;br&gt;
Volgens MSDN zou het validationsummary control nu de Password Required tekst en Username
Required tekst kunnen tonen.&lt;br&gt;
&lt;br&gt;
Door een bug in het validationsummary control is dit echter niet het geval. Een workaround
is door in uiValid.ValidationGroup het unieke ID van uiLogin te plaatsen, dit kan
alleen in code. Na het toevoegen van onderstaande c# regel aan het Page_Load event
is uiValid in staat de Password Required tekst en Username Required tekst te tonen.&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;
&lt;br&gt;
uiValid.ValidationGroup &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; uiLogin.UniqueID; 
&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
Klik &lt;a href="http://lab.msdn.microsoft.com/productfeedback/viewfeedback.aspx?feedbackid=29876470-1cbd-4a2c-ac4b-8de868a401ee" target=_new&gt;hier&lt;/a&gt; voor
meer info over deze bug en mijn geposte workaround.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=50c7ed20-5cf5-4b5b-8e2a-99a2289c0c4d" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,50c7ed20-5cf5-4b5b-8e2a-99a2289c0c4d.aspx</comments>
      <category>ASP.NET</category>
    </item>
  </channel>
</rss>