<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" version="2.0">
  <channel>
    <title>RichardSoeteman.NET</title>
    <link>http://www.richardsoeteman.net/</link>
    <description />
    <language>nl-nl</language>
    <copyright>Richard Soeteman</copyright>
    <lastBuildDate>Tue, 30 Jun 2009 07:43:08 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 1.9.6264.0</generator>
    <managingEditor>richard@richardsoeteman.net</managingEditor>
    <webMaster>richard@richardsoeteman.net</webMaster>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=79b35431-6f38-43e6-ae34-3a3e428892d5</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,79b35431-6f38-43e6-ae34-3a3e428892d5.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,79b35431-6f38-43e6-ae34-3a3e428892d5.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=79b35431-6f38-43e6-ae34-3a3e428892d5</wfw:commentRss>
      <title>UmbImport V1 released</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,79b35431-6f38-43e6-ae34-3a3e428892d5.aspx</guid>
      <link>http://www.richardsoeteman.net/PermaLink,guid,79b35431-6f38-43e6-ae34-3a3e428892d5.aspx</link>
      <pubDate>Tue, 30 Jun 2009 07:43:08 GMT</pubDate>
      <description>&lt;p&gt;
I'm very pleased to announce that I finally released the V1 version of UmbImport.
For those of you who don't know what UmbImport is:
&lt;/p&gt;
&lt;p&gt;
UmbImport helps you import content or members from any datasource into &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5&amp;amp;url=http%3a%2f%2fwww.umbraco.org"&gt;Umbraco&lt;/a&gt;.
The following datasources are supported by default: 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
SQL Server 
&lt;/li&gt;
&lt;li&gt;
CSV file 
&lt;/li&gt;
&lt;li&gt;
XML file 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You can also create your own custom DataAdapter. Check out the following links to
screencasts to see the power of UmbImport.&amp;#160; 
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5&amp;amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fPermaLink%2cguid%2c189035af-bbc0-4d3f-8d54-9782c06794e7.aspx"&gt;Import
content&amp;#160; &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5&amp;amp;url=http%3a%2f%2fwww.vimeo.com%2f3853997"&gt;Import
members&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The package is added to &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5&amp;amp;url=http%3a%2f%2four.umbraco.org%2f"" target="_blank"&gt;our.umbraco.org&lt;/a&gt; the
new &lt;a title="Umbraco" href="http://www.richardsoeteman.net/ct.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5&amp;amp;url=http%3a%2f%2fwww.umbraco.org"" target="_blank"&gt;Umbraco&lt;/a&gt; community
site , so you can &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5&amp;amp;url=http%3a%2f%2four.umbraco.org%2fprojects%2fumbimport"" target="_blank"&gt;download&lt;/a&gt; it
there or use the &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5&amp;amp;url=http%3a%2f%2fumbimport.soetemansoftware.nl%2f"" target="_blank"&gt;UmbImport&lt;/a&gt; site.
On &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5&amp;amp;url=http%3a%2f%2four.umbraco.org%2f"" target="_blank"&gt;our.umbraco.org&lt;/a&gt; you
will find a forum also where you can drop your questions/feature requests/ bugs etc.
In August I will release a manual also. If you find any issues please report it on
the forum or comment on this post.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,79b35431-6f38-43e6-ae34-3a3e428892d5.aspx</comments>
      <category>UmbImport;Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=ec1b9387-aef3-47c9-86d8-eb9cb917baff</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,ec1b9387-aef3-47c9-86d8-eb9cb917baff.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,ec1b9387-aef3-47c9-86d8-eb9cb917baff.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ec1b9387-aef3-47c9-86d8-eb9cb917baff</wfw:commentRss>
      <title>Update: Adding menu items using the event system</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,ec1b9387-aef3-47c9-86d8-eb9cb917baff.aspx</guid>
      <link>http://www.richardsoeteman.net/PermaLink,guid,ec1b9387-aef3-47c9-86d8-eb9cb917baff.aspx</link>
      <pubDate>Mon, 04 May 2009 19:06:31 GMT</pubDate>
      <description>&lt;p&gt;
In February I wrote this blogpost which describes the process of how to add a menu
item to the context menu using the Umbraco V4 Event system. In UmbImport PRO I've
used this mechanism. When I was testing this I came across a bug in my code when using
a pagepicker, this was showing an empty tree in the node picker.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;img height="153" alt="EmptynodePicker" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/UpdateAddingmenuitemsusingtheeventsystem_126B9/EmptynodePicker_273f8b38-a34b-4bb0-80be-d2c832c2a354.jpg" width="301" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Then I got a little flashback to the level 2 course I attended last November where
Niels told us to check if there was a menu attached to the node (which is not the
case for the pagepicker) before adding menu items to it, otherwise an exception is
thrown what will result in an empty tree. This is what happened in my case. In the
example below I've only added &lt;strong&gt;node.Menu!= &lt;/strong&gt;&lt;span class="kwrd"&gt;&lt;strong&gt;null &lt;/strong&gt;check
and now everything is working fine.&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&amp;#160;
&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;#160;&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;#160;&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; (&lt;strong&gt;node.Menu!= &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;/strong&gt; &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&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;&amp;quot;publish&amp;quot;&lt;/span&gt;;
})+1;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt;&amp;#160;&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;pre&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt;&amp;#160;&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/ct.ashx?id=ec1b9387-aef3-47c9-86d8-eb9cb917baff&amp;amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fdownloads%2fUmbraco%2fUnpublishmenuitem.zip"" target="_blank"&gt;Download
Source&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Hope it didn't get you into trouble, sorry if it did.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ec1b9387-aef3-47c9-86d8-eb9cb917baff" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,ec1b9387-aef3-47c9-86d8-eb9cb917baff.aspx</comments>
      <category>Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=88590237-db9a-4d5c-b718-c5986249d877</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,88590237-db9a-4d5c-b718-c5986249d877.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,88590237-db9a-4d5c-b718-c5986249d877.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=88590237-db9a-4d5c-b718-c5986249d877</wfw:commentRss>
      <title>Create a custom data adapter for UmbImport part 1</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,88590237-db9a-4d5c-b718-c5986249d877.aspx</guid>
      <link>http://www.richardsoeteman.net/PermaLink,guid,88590237-db9a-4d5c-b718-c5986249d877.aspx</link>
      <pubDate>Thu, 16 Apr 2009 22:02:37 GMT</pubDate>
      <description>&lt;p&gt;
As I mentioned earlier it's possible to create a custom data adapter which can be
plugged into umbImport. The free edition supports one custom data adapter, the pro
edition will support multiple adapters.&amp;#160; In this multi part series I will demonstrate
how you can create your own data adapter by building an RSS import adapter. In this
first part we will create the basic adapter in later post we will refine the functionality.
For this first part I've installed &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=88590237-db9a-4d5c-b718-c5986249d877&amp;amp;url=http%3a%2f%2fumbraco.codeplex.com%2fRelease%2fProjectReleases.aspx%3fReleaseId%3d18661"" target="_blank"&gt;Umbraco
4.0.1&lt;/a&gt; and the packages &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=88590237-db9a-4d5c-b718-c5986249d877&amp;amp;url=http%3a%2f%2fwww.codeplex.com%2fblog4umbraco"" target="_blank"&gt;Blog4Umbraco&lt;/a&gt; and &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=88590237-db9a-4d5c-b718-c5986249d877&amp;amp;url=http%3a%2f%2fumbimport.soetemansoftware.nl%2f"" target="_blank"&gt;UmbImport
beta 1&lt;/a&gt;. 
&lt;/p&gt;
&lt;h4&gt;Create the adapter
&lt;/h4&gt;
&lt;p&gt;
You can create a custom data adapter by deriving from two classes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
UmbImportLibrary.BaseTypes.ImportDataAdapter. 
&lt;/li&gt;
&lt;li&gt;
UmbImportLibrary.BaseTypes.ImportDataUI. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The ImportDataAdapter class provides the real communication to the datasource and
holds a reference to the ImportDataUI class which is responsible for the user input.
For our RSS import adapter we will start by creating the UI class. 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&amp;#160;&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RSSDataAdapterUI
: ImportDataUI&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; Panel _rssContentPanel
= &lt;span class="kwrd"&gt;new&lt;/span&gt; Panel();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; Literal _selectRssSourceLiteral
= &lt;span class="kwrd"&gt;new&lt;/span&gt; Literal();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 5: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; TextBox _rssLocation
= &lt;span class="kwrd"&gt;new&lt;/span&gt; TextBox();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnInit(EventArgs
e)&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="kwrd"&gt;base&lt;/span&gt;.OnInit(e);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 11: &lt;/span&gt; _rssContentPanel.ID = &lt;span class="str"&gt;&amp;quot;RssContentPanel&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; _selectRssSourceLiteral.ID = &lt;span class="str"&gt;&amp;quot;SelectRssSourceLiteral&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; _selectRssSourceLiteral.Text = &lt;span class="str"&gt;&amp;quot;Specify
the RSSLocation&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt; _rssLocation.ID = &lt;span class="str"&gt;&amp;quot;RssLocation&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; _rssLocation.Width = 400;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; _rssContentPanel.Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; LiteralControl(&lt;span class="str"&gt;&amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td
width=\&amp;quot;150\&amp;quot;&amp;gt;&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt; _rssContentPanel.Controls.Add(_selectRssSourceLiteral);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 18: &lt;/span&gt; _rssContentPanel.Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; LiteralControl(&lt;span class="str"&gt;&amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt; _rssContentPanel.Controls.Add(_rssLocation);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt; _rssContentPanel.Controls.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; LiteralControl(&lt;span class="str"&gt;&amp;quot;
example http://feeds.feedburner.com/umbracoblog &amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Controls.Add(_rssContentPanel);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 24: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 25: &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; 26: &lt;/span&gt; &lt;span class="rem"&gt;/// Returns the Datasource&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 27: &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; 28: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; DataSource&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt; get&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="kwrd"&gt;return&lt;/span&gt; _rssLocation.Text;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 33: &lt;/span&gt;&amp;#160;&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;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &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;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;
The OnInit method generates the form. The only real interesting thing in this class
is the datasource property. This will be used in UmbImport to initialize the import
with the selected datasource.
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RSSDataAdapter
: ImportDataAdapter&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; ImportDataUI
_xmlImportUI;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 5: &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; 6: &lt;/span&gt; &lt;span class="rem"&gt;/// Alias of the import adapter&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="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Alias&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 9: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 10: &lt;/span&gt; get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="str"&gt;&amp;quot;RssImport&amp;quot;&lt;/span&gt;;
}&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;&amp;#160;&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="rem"&gt;/// Get XML Data&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 15: &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; 16: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&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; &lt;span class="kwrd"&gt;override&lt;/span&gt; IDataReader
GetData()&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; &lt;span class="kwrd"&gt;return&lt;/span&gt; XmlToDataReader(DataSource, &lt;span class="str"&gt;&amp;quot;//item&amp;quot;&lt;/span&gt;);&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;#160;&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;/// Validates the selected
datasource&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;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Validate()&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="kwrd"&gt;bool&lt;/span&gt; result = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 28: &lt;/span&gt; &lt;span class="kwrd"&gt;try&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt; &lt;span class="kwrd"&gt;using&lt;/span&gt; (IDataReader
datareader = XmlToDataReader(DataSource, &lt;span class="str"&gt;&amp;quot;//item&amp;quot;&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; result = &lt;span class="kwrd"&gt;true&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;pre&gt;&lt;span class="lnum"&gt; 35: &lt;/span&gt; &lt;span class="kwrd"&gt;catch&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 36: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 37: &lt;/span&gt; result = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 38: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; result;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 42: &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; 43: &lt;/span&gt; &lt;span class="rem"&gt;/// Holds a reference to the
UI control of the adapter&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 44: &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; 45: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; ImportDataUI
UIControl&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; get&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;span class="kwrd"&gt;if&lt;/span&gt; (_xmlImportUI == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 50: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 51: &lt;/span&gt; _xmlImportUI = &lt;span class="kwrd"&gt;new&lt;/span&gt; RSSDataAdapterUI();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 52: &lt;/span&gt; _xmlImportUI.ID = &lt;span class="str"&gt;&amp;quot;RssImport&amp;quot;&lt;/span&gt;;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 53: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 54: &lt;/span&gt; &lt;span class="kwrd"&gt;return&lt;/span&gt; _xmlImportUI;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 55: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 56: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 57: &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;/div&gt;
&lt;p&gt;
The Alias property will return the unique alias that we can use to select our adapter
during the Import process. The GetData method will return a datareader initialized
with the datasource. When importing XML it needs to be converted to a datareader first.
The ImportDataAdapter Base class has a method XmlToDataReader what will convert the
xml file to&amp;#160; a datareader. The Validate method will check if the selected datasource
is valid. The UIControl property holds a reference to the RSSDataAdapterUI class.
The ImportDataAdapter base class has more properties/methods that you can override
but for this data adapter we are done.
&lt;/p&gt;
&lt;p&gt;
When you compile the project and put the DLL in the bin folder of the Umbraco install
the DLL will be picked up automatically by UmbImport.
&lt;/p&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h4&gt;Using the RSS import adapter
&lt;/h4&gt;
&lt;p&gt;
When you start UmbImport you will see in step 2 that you can select the RssImport
data adapter
&lt;/p&gt;
&lt;p&gt;
&lt;img height="457" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/CreateacustomdataadapterforumbImportpart_136ED/image_937ffe26-ea18-44a0-89ae-3dbfd38fda7a.png" width="723" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
In the next step we will see the form that we have created in the RSSDataAdapterUI
class. Here we can specify the RSS location.
&lt;/p&gt;
&lt;p&gt;
&lt;img height="457" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/CreateacustomdataadapterforumbImportpart_136ED/image_bb50e1c6-4187-4a60-987a-2ebe6fc03fa5.png" width="723" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
In the Next step we can specify the location where to store the blogposts (Note: When
using the Blog package blogposts will be arranged by data automatically) and we select
the blogpost as document type.&amp;#160; In step 5 we will create the mapping between
the fields from the RSS feed and the Umbraco Document Properties. You will see a lot
of other fields from the RSS Feed. Just ignore them for now. In a later post we will
filter the columns.
&lt;/p&gt;
&lt;p&gt;
&lt;img height="506" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/CreateacustomdataadapterforumbImportpart_136ED/image_c33620e9-c43f-4a4d-8605-b2acd25539e3.png" width="723" border="0" /&gt; 
&lt;/p&gt;
&lt;h4&gt;The result
&lt;/h4&gt;
&lt;p&gt;
When you click next and next again on the confirm screen the RSS feed will be imported. 
&lt;/p&gt;
&lt;p&gt;
&lt;img height="506" alt="image" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/CreateacustomdataadapterforumbImportpart_136ED/image_9cdd6c1c-3612-496a-95cc-df9dd6cd7703.png" width="723" border="0" /&gt;&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
In the next post I will show you how to Import the comment data with the same Adapter.
I will also show you how to filter the columns for the property mapping dropdowns.
When you want to play with this import adapter then&amp;#160; &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=88590237-db9a-4d5c-b718-c5986249d877&amp;amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fdownloads%2fUmbraco%2fRSSDataAdapter.zip"" target="_blank"&gt;download
the source here.&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=88590237-db9a-4d5c-b718-c5986249d877" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,88590237-db9a-4d5c-b718-c5986249d877.aspx</comments>
      <category>UmbImport;Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=3d85a1f8-9d7d-4dea-a592-8b6d84eac613</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,3d85a1f8-9d7d-4dea-a592-8b6d84eac613.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,3d85a1f8-9d7d-4dea-a592-8b6d84eac613.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=3d85a1f8-9d7d-4dea-a592-8b6d84eac613</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Auto add dictionary items another approach</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,3d85a1f8-9d7d-4dea-a592-8b6d84eac613.aspx</guid>
      <link>http://www.richardsoeteman.net/PermaLink,guid,3d85a1f8-9d7d-4dea-a592-8b6d84eac613.aspx</link>
      <pubDate>Wed, 01 Apr 2009 20:24:15 GMT</pubDate>
      <description>&lt;p&gt;
Last week I had a meeting with Nico Lubbers and we discussed the possibility of adding
Dictionary Items on the fly. You can read in &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=3d85a1f8-9d7d-4dea-a592-8b6d84eac613&amp;amp;url=http%3a%2f%2fwww.nibble.be%2f%3fp%3d14"" target="_blank"&gt;this
post from Tim&lt;/a&gt; that it's been done before, but we want to make sure that it works
in every situation (Template, Usercontrol and Xslt) and we don't want a baseclass
for just adding items to the dictionary . Also we want logical keys (like savebuttonText,
companynameLabel etc.) instead of generated keys. Basically we want the pain of adding&amp;#160;
the dictionary items in the templates, usercontrols and xslt's&amp;#160; but we don't
want the pain of adding&amp;#160; the dictionary items in Umbraco manually. Now before
your read on I must warn you that the solution is not based on an architecture &lt;img alt=";-)" src="smilies/wink.gif"&gt;
&lt;/p&gt;
&lt;h4&gt;What happens if Umbraco can't find a dictionary item?
&lt;/h4&gt;
&lt;p&gt;
When you add a dictionary item on a template, usercontrol or XSLT and Umbraco can't
find it an exception is thrown. Umbraco will catch that exception and write it to
the tracelog. For this blogpost I've used a standard Umbraco 4.0.1 instance with Runway
and the modules contact form and standard navigation installed. In the example below
I'be added a few non existing Dictionary items to my code.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Template&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;umbraco:Item&lt;/span&gt; &lt;span class="attr"&gt;field&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;#Template_DetailHeader&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;umbraco:Item&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&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;strong&gt;XSLT&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:value-of&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;umbraco.library:GetDictionaryItem('XSLT_FromDictionary')&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&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;strong&gt;Usercontrol Markup&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="asp"&gt;&amp;lt;%&lt;/span&gt;=umbraco.library.GetDictionaryItem(&lt;span class="str"&gt;&amp;quot;UserControl_Details&amp;quot;&lt;/span&gt;) &lt;span class="asp"&gt;%&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;strong&gt;Usercontrol Codebehind&lt;/strong&gt;
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;lb_name.Text = umbraco.library.GetDictionaryItem(&lt;span class="str"&gt;&amp;quot;UserControl_LabelCaption&amp;quot;&lt;/span&gt;); &lt;/pre&gt;
&lt;p&gt;
Now when you view the page you will see empty places instead of the dictionary values.
What's more interesting is to view the page with the queryparameter ?umbdebugshowtrace=true
what shows you the trace info of the page like the image below. 
&lt;/p&gt;
&lt;p&gt;
&lt;img height="480" alt="traceinfo" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Autoadddictionaryitemsanotherapprouch_EB82/traceinfo_74065c55-e1cf-4ae1-81d0-4b5e6d407af5.jpg" width="619" border="0" /&gt;&amp;#160; 
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h4&gt;How can we get that data?
&lt;/h4&gt;
&lt;p&gt;
While it's nice that we can view the data, it would be great if we can parse the trace
info and automatically add the missing dictionary items. This can be done using a &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=3d85a1f8-9d7d-4dea-a592-8b6d84eac613&amp;amp;url=http%3a%2f%2fwww.15seconds.com%2fIssue%2f020910.htm"" target="_blank"&gt;Trace
Listener&lt;/a&gt;, when an item is added to the trace you can configure 1 or more trace
listeners that recieve the message then we can parse. In the&amp;#160; Class below I derive
from the TraceListener class. The TraceListener methods calls the AddItemUnknown method
which check the message with a regular expression. If the message can be parsed the
unknow dictionary key is retrieved from the message and will be added to Umbraco.
To ensure we will see the value when we refresh the page the key will also be added
as the value for every language.
&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.Diagnostics;&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.RegularExpressions;&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.language;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 6: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SoetemanSoftware.Tools&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="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; AddUnknownDictionaryItemsListener
: TraceListener&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="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Fail(&lt;span class="kwrd"&gt;string&lt;/span&gt; message)&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; AddItemWhenUnknown(message);&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;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Fail(&lt;span class="kwrd"&gt;string&lt;/span&gt; message, &lt;span class="kwrd"&gt;string&lt;/span&gt; detailMessage)&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; AddItemWhenUnknown(message);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 19: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 20: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 21: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Write(&lt;span class="kwrd"&gt;string&lt;/span&gt; message)&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; AddItemWhenUnknown(message);&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;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 26: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt; message)&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; AddItemWhenUnknown(message);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 29: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 30: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteLine(&lt;span class="kwrd"&gt;string&lt;/span&gt; message, &lt;span class="kwrd"&gt;string&lt;/span&gt; category)&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; AddItemWhenUnknown(message);&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;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 35: &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; 36: &lt;/span&gt; &lt;span class="rem"&gt;/// Parse at the message &lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 37: &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; 38: &lt;/span&gt; &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;message&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt; &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; AddItemWhenUnknown(&lt;span class="kwrd"&gt;string&lt;/span&gt; message)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 41: &lt;/span&gt; &lt;span class="kwrd"&gt;try&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; Match match = Regex.Match(message, &lt;span class="str"&gt;&amp;quot;(Error
returning dictionary item ')(.*)(' --)&amp;quot;&lt;/span&gt;, RegexOptions.Multiline);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 44: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (match.Groups.Count
&amp;gt; 1)&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;span class="rem"&gt;//Get key from the mach collection&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 47: &lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; key = match.Groups[2].Value;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 48: &lt;/span&gt; &lt;span class="rem"&gt;//Check if key is allready
in Umbraco&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 49: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (!umbraco.cms.businesslogic.Dictionary.DictionaryItem.hasKey(key))&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 50: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 51: &lt;/span&gt; &lt;span class="rem"&gt;//Add new key with default
value to Umbraco&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 52: &lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; dictionaryID =
umbraco.cms.businesslogic.Dictionary.DictionaryItem.addKey(key, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;[{0}]&amp;quot;&lt;/span&gt;,
key));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 53: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 54: &lt;/span&gt; var dictionaryItem = &lt;span class="kwrd"&gt;new&lt;/span&gt; umbraco.cms.businesslogic.Dictionary.DictionaryItem(dictionaryID);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 55: &lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (Language l &lt;span class="kwrd"&gt;in&lt;/span&gt; Language.getAll)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 56: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 57: &lt;/span&gt; dictionaryItem.setValue(l.id, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;[{0}]&amp;quot;&lt;/span&gt;,
key));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 58: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 59: &lt;/span&gt; dictionaryItem.Save();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 60: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 61: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 62: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 63: &lt;/span&gt; &lt;span class="kwrd"&gt;catch&lt;/span&gt; (Exception ex)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 64: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 65: &lt;/span&gt; &lt;span class="rem"&gt;//Logic may never break on
this Listener&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 66: &lt;/span&gt; Log.Add(LogTypes.Error, -1, &lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;&amp;quot;Error
in Dictionary listener when adding item to dictionary {0} &amp;quot;&lt;/span&gt;, ex.Message));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 67: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 68: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 69: &lt;/span&gt; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 70: &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;Configure the TraceListener
&lt;/h4&gt;
&lt;p&gt;
When you want to use the TraceListener you have to configure it in the web.config.
Add the following section to your web.config file.
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;system.diagnostics&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;trace&lt;/span&gt; &lt;span class="attr"&gt;autoflush&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;indentsize&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;4&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;listeners&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;remove&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;Default&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;AddDictionaryListener&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SoetemanSoftware.Tools.AddUnknownDictionaryItemsListener,AddUnknownDictionaryItemsListener&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;listeners&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;trace&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;system.diagnostics&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Also modify the existing Trace element by adding the &lt;strong&gt;writeToDiagnosticsTrace=&amp;quot;true&amp;quot;&lt;/strong&gt;.
This will forward the ASP.NET trace messages to our AddUnknownDictionaryItemsListener.
Simply set this attribute to false if you don't want the items to be added automatically.
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;trace&lt;/span&gt; &lt;span class="attr"&gt;enabled&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;requestLimit&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;10&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;pageOutput&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;false&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;traceMode&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;SortByTime&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;localOnly&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;writeToDiagnosticsTrace&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;h4&gt;View the output
&lt;/h4&gt;
&lt;p&gt;
When you configured the trace listener and hit the page again the missing dictionary
items are added to Umbraco.
&lt;/p&gt;
&lt;p&gt;
&lt;img height="142" alt="dictionary items" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Autoadddictionaryitemsanotherapprouch_EB82/dictionary%20items_9a585ac1-1043-48a2-a212-e45decd5713d.jpg" width="453" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Refresh the page again and you will see the following output
&lt;/p&gt;
&lt;p&gt;
&lt;img height="480" alt="output" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Autoadddictionaryitemsanotherapprouch_EB82/output_80c7006f-fc9c-46bc-b4f2-d0d39e5c352a.jpg" width="619" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Sometimes you will encounter caching issues. When you want to avoid that use the umbdebugshowtrace=true
querystring parameter which will prevent caching.
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;h4&gt;Download
&lt;/h4&gt;
&lt;p&gt;
You can download the &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=3d85a1f8-9d7d-4dea-a592-8b6d84eac613&amp;amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fdownloads%2fumbraco%2fAddUnknownDictionaryItemsListener.zip"" target="_blank"&gt;DLL
here&lt;/a&gt;. You can also dowload the &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=3d85a1f8-9d7d-4dea-a592-8b6d84eac613&amp;amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fdownloads%2fumbraco%2fAddUnknownDictionaryItemsListener_source.zip"" target="_blank"&gt;source
here&lt;/a&gt;.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=3d85a1f8-9d7d-4dea-a592-8b6d84eac613" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,3d85a1f8-9d7d-4dea-a592-8b6d84eac613.aspx</comments>
      <category>Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=9ac856e3-3d8e-4f18-b39b-f268defa744f</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,9ac856e3-3d8e-4f18-b39b-f268defa744f.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,9ac856e3-3d8e-4f18-b39b-f268defa744f.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=9ac856e3-3d8e-4f18-b39b-f268defa744f</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>New Beta version of UmbImport</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,9ac856e3-3d8e-4f18-b39b-f268defa744f.aspx</guid>
      <link>http://www.richardsoeteman.net/PermaLink,guid,9ac856e3-3d8e-4f18-b39b-f268defa744f.aspx</link>
      <pubDate>Wed, 25 Mar 2009 21:17:38 GMT</pubDate>
      <description>&lt;p&gt;
Exactly 1 year ago I've downloaded &lt;a title="Umbraco" href="http://www.richardsoeteman.net/ct.ashx?id=9ac856e3-3d8e-4f18-b39b-f268defa744f&amp;amp;url=http%3a%2f%2fwww.umbraco.org%2f"" target="_blank"&gt;Umbraco&lt;/a&gt; for
the very first time and loving it ever since. One package that I've created in September
last year was UmbImport. While that was a cool package I'm happy to announce that
today I've released a new beta version of UmbImport. The most requested feature was
the ability to import members. I'm happy to announce that this feature is implemented
now. Below you find&amp;#160; a screencast that demo's the member import.
&lt;/p&gt;
&lt;p&gt;
&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=3853997&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" width="400" height="300" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" /&gt; 
&lt;br /&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=9ac856e3-3d8e-4f18-b39b-f268defa744f&amp;amp;url=http%3a%2f%2fvimeo.com%2f3853997"&gt;Import
members using umbImport&lt;/a&gt; from &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=9ac856e3-3d8e-4f18-b39b-f268defa744f&amp;amp;url=http%3a%2f%2fvimeo.com%2fuser1486818"&gt;Richard
Soeteman&lt;/a&gt; on &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=9ac856e3-3d8e-4f18-b39b-f268defa744f&amp;amp;url=http%3a%2f%2fvimeo.com"&gt;Vimeo&lt;/a&gt;.
&lt;/p&gt;
&lt;h3&gt;More changes
&lt;/h3&gt;
&lt;p&gt;
While member import is the biggest thing, it's nice to know what's also changed since
the last version. I will be blogging about each feature/change the next coming weeks.
&lt;/p&gt;
&lt;h3&gt;
&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;DataAdapters.&lt;/strong&gt; The previous version of UmbImport only supported three
datasources (Sql Server, CSV and XML). With the new version you can plugin your own
datasource by creating a custom DataAdapter (in the free version this will be limited
to 1). 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Events during import.&lt;/strong&gt; Events are added that you can handle in your
custom code that notify you when a record is imported. 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No more Dashboard control.&lt;/strong&gt; UmbImport is moved from a dashboard control
to a tree in the menu. 
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better install experience. &lt;/strong&gt;With Umbraco 4 it's easier to create a
package and modify config files etc via PackageActions. UmbImport uses default and
Custom package actions to improve the install experience. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;What's next?
&lt;/h3&gt;
&lt;p&gt;
Within a few weeks I hope to get V1 released and have proper documentation that describe
the functionality. After that I will work on UmbImport PRO, which will contain a few
extra features such as save wizard steps, scheduled imports, automatic field mapping,
support for more than 1 custom DataAdapter and more... The PRO version of UmbImport
will not be free(prices are not available yet). 
&lt;/p&gt;
&lt;p&gt;
As always I hope that you like the package which you can &lt;a title="Download umbImport" href="http://www.richardsoeteman.net/ct.ashx?id=9ac856e3-3d8e-4f18-b39b-f268defa744f&amp;amp;url=http%3a%2f%2fumbimport.soetemansoftware.nl%2f"&gt;download
here&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=9ac856e3-3d8e-4f18-b39b-f268defa744f" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,9ac856e3-3d8e-4f18-b39b-f268defa744f.aspx</comments>
      <category>UmbImport;Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=90e0ca4a-0e98-4962-9d86-5381d57e6ae7</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,90e0ca4a-0e98-4962-9d86-5381d57e6ae7.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,90e0ca4a-0e98-4962-9d86-5381d57e6ae7.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=90e0ca4a-0e98-4962-9d86-5381d57e6ae7</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Currently I'm working on an Umbraco V4 site and had an issue when rendering the meta
tags.
</p>
        <h4>The problem:
</h4>
        <p>
In my template I've added the keywords and description tag in the head to render the
meta information for keywords and description. 
</p>
        <pre class="csharpcode">&lt;head runat="server"&gt;
&lt;meta name="keywords" content="&lt;umbraco:Item field=<span class="str">'metaKeywords'</span><span class="kwrd">recursive</span>=<span class="str">'true'</span> runat=<span class="str">'server'</span>&gt;&lt;/umbraco:Item&gt;"
/&gt; &lt;meta name="description" content="&lt;umbraco:Item field=<span class="str">'metaDescription'</span><span class="kwrd">recursive</span>=<span class="str">'true'</span> runat=<span class="str">'server'</span>&gt;&lt;/umbraco:Item&gt;"
/&gt; &lt;/head&gt;</pre>
        <p>
I've seen several examples that used the &lt;Umbraco:Item&gt; control with single
quotes to set the properties so I thought this should work. However when the output
was different then I would expect:
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">head</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">meta</span>
          <span class="attr">name</span>
          <span class="kwrd">="keywords"</span>
          <span class="attr">content</span>="&amp;<span class="attr">amp</span>;<span class="attr">lt</span>;<span class="attr">umbraco:Item</span><span class="attr">field</span><span class="kwrd">='metaKeywords'</span><span class="attr">recursive</span><span class="kwrd">='true'</span><span class="attr">runat</span><span class="kwrd">='server'</span><span class="kwrd">&gt;</span><span class="attr">&amp;lt;</span>/umbraco:Item<span class="kwrd">&gt;</span>" <span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">meta</span><span class="attr">name</span><span class="kwrd">="description"</span><span class="attr">content</span>="&amp;<span class="attr">amp</span>;<span class="attr">lt</span>;<span class="attr">umbraco:Item</span><span class="attr">field</span><span class="kwrd">='metaDescription'</span><span class="attr">recursive</span><span class="kwrd">='true'</span><span class="attr">runat</span><span class="kwrd">='server'</span><span class="kwrd">&gt;</span><span class="attr">&amp;lt;</span>/umbraco:Item<span class="kwrd">&gt;</span>" <span class="kwrd">/&gt;</span><span class="kwrd">&lt;/</span><span class="html">head</span><span class="kwrd">&gt;</span></pre>
        <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>The Cause:
</h4>
        <p>
When I took a detailed look on this issue I saw that the head tag in my template had
a Runat="Server" attribute. When I removed this attribute the output was
rendered fine. I'm using a few Ajax Controls on forms that throws an error when it
can't find a Head tag with the Runat="Server" attribute, so simply removing
it isn't the solution.
</p>
        <h4>The solution,  Macro's to the rescue:
</h4>
        <p>
With a Macro and an XSLT file this issue can easily be solved and after thinking of
it it's also a better solution because it's a better separation between HTML and ASP.Net
code. To solve it you just create a Macro that excepts two parameters (keywords and
description). Then create an XSLT file that outputs the values like this example:
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;?</span>
          <span class="html">xml</span>
          <span class="attr">version</span>
          <span class="kwrd">="1.0"</span>
          <span class="attr">encoding</span>
          <span class="kwrd">="UTF-8"</span>?<span class="kwrd">&gt;</span><span class="kwrd">&lt;!</span><span class="html">DOCTYPE</span><span class="attr">xsl:stylesheet</span> [
&amp;<span class="attr">lt</span>;!<span class="attr">ENTITY</span><span class="attr">nbsp</span><span class="kwrd">"&amp;#x00A0;"</span><span class="kwrd">&gt;</span> ]<span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">xsl:stylesheet</span><span class="attr">version</span><span class="kwrd">="1.0"</span><span class="attr">xmlns:xsl</span><span class="kwrd">="http://www.w3.org/1999/XSL/Transform"</span><span class="attr">xmlns:msxml</span><span class="kwrd">="urn:schemas-microsoft-com:xslt"</span><span class="attr">xmlns:umbraco</span>.<span class="attr">library</span><span class="kwrd">="urn:umbraco.library"</span><span class="attr">exclude-result-prefixes</span><span class="kwrd">="msxml
umbraco.library"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">xsl:output</span><span class="attr">method</span><span class="kwrd">="xml"</span><span class="attr">omit-xml-declaration</span><span class="kwrd">="yes"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">xsl:param</span><span class="attr">name</span><span class="kwrd">="currentPage"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">xsl:variable</span><span class="attr">name</span><span class="kwrd">="keywords"</span><span class="attr">select</span><span class="kwrd">="/macro/keywords"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">xsl:variable</span><span class="attr">name</span><span class="kwrd">="description"</span><span class="attr">select</span><span class="kwrd">="/macro/description"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">xsl:template</span><span class="attr">match</span><span class="kwrd">="/"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">meta</span><span class="attr">name</span><span class="kwrd">="keywords"</span><span class="attr">content</span><span class="kwrd">="{$keywords}"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;</span><span class="html">meta</span><span class="attr">name</span><span class="kwrd">="description"</span><span class="attr">content</span><span class="kwrd">="{$description}"</span><span class="kwrd">/&gt;</span><span class="kwrd">&lt;/</span><span class="html">xsl:template</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">xsl:stylesheet</span><span class="kwrd">&gt;</span></pre>
        <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>
Then use the Macro in your template:
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">umbraco:Macro</span>
          <span class="attr">keywords</span>
          <span class="kwrd">="[$metaKeywords]"</span>
          <span class="attr">description</span>
          <span class="kwrd">="[$metaDescription]"</span>
          <span class="attr">Alias</span>
          <span class="kwrd">="MetaTags"</span>
          <span class="attr">runat</span>
          <span class="kwrd">="server"</span>
          <span class="kwrd">&gt;&lt;/</span>
          <span class="html">umbraco:Macro</span>
          <span class="kwrd">&gt;</span>
        </pre>
        <p>
Now you have exact the same functionality and it will work in any situation. Because
I'm using the $ sign before the fieldnames that are passed to the Umbraco. Umbraco
will do a recursive search for the values of those properties, just like the recursive
attribute does on the Umbraco:item tag.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=90e0ca4a-0e98-4962-9d86-5381d57e6ae7" />
      </body>
      <title>Meta tags, Umbraco:item control and runat=&amp;quot;server&amp;quot; magic</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,90e0ca4a-0e98-4962-9d86-5381d57e6ae7.aspx</guid>
      <link>http://www.richardsoeteman.net/PermaLink,guid,90e0ca4a-0e98-4962-9d86-5381d57e6ae7.aspx</link>
      <pubDate>Tue, 17 Mar 2009 09:04:43 GMT</pubDate>
      <description>&lt;p&gt;
Currently I'm working on an Umbraco V4 site and had an issue when rendering the meta
tags.
&lt;/p&gt;
&lt;h4&gt;The problem:
&lt;/h4&gt;
&lt;p&gt;
In my template I've added the keywords and description tag in the head to render the
meta information for keywords and description. 
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&amp;lt;head runat=&amp;quot;server&amp;quot;&amp;gt;
&amp;lt;meta name=&amp;quot;keywords&amp;quot; content=&amp;quot;&amp;lt;umbraco:Item field=&lt;span class="str"&gt;'metaKeywords'&lt;/span&gt; &lt;span class="kwrd"&gt;recursive&lt;/span&gt;=&lt;span class="str"&gt;'true'&lt;/span&gt; runat=&lt;span class="str"&gt;'server'&lt;/span&gt;&amp;gt;&amp;lt;/umbraco:Item&amp;gt;&amp;quot;
/&amp;gt; &amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;&amp;lt;umbraco:Item field=&lt;span class="str"&gt;'metaDescription'&lt;/span&gt; &lt;span class="kwrd"&gt;recursive&lt;/span&gt;=&lt;span class="str"&gt;'true'&lt;/span&gt; runat=&lt;span class="str"&gt;'server'&lt;/span&gt;&amp;gt;&amp;lt;/umbraco:Item&amp;gt;&amp;quot;
/&amp;gt; &amp;lt;/head&amp;gt;&lt;/pre&gt;
&lt;p&gt;
I've seen several examples that used the &amp;lt;Umbraco:Item&amp;gt; control with single
quotes to set the properties so I thought this should work. However when the output
was different then I would expect:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;meta&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;keywords&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;content&lt;/span&gt;=&amp;quot;&amp;amp;&lt;span class="attr"&gt;amp&lt;/span&gt;;&lt;span class="attr"&gt;lt&lt;/span&gt;;&lt;span class="attr"&gt;umbraco:Item&lt;/span&gt; &lt;span class="attr"&gt;field&lt;/span&gt;&lt;span class="kwrd"&gt;='metaKeywords'&lt;/span&gt; &lt;span class="attr"&gt;recursive&lt;/span&gt;&lt;span class="kwrd"&gt;='true'&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;='server'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/umbraco:Item&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&amp;quot; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;meta&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;description&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;content&lt;/span&gt;=&amp;quot;&amp;amp;&lt;span class="attr"&gt;amp&lt;/span&gt;;&lt;span class="attr"&gt;lt&lt;/span&gt;;&lt;span class="attr"&gt;umbraco:Item&lt;/span&gt; &lt;span class="attr"&gt;field&lt;/span&gt;&lt;span class="kwrd"&gt;='metaDescription'&lt;/span&gt; &lt;span class="attr"&gt;recursive&lt;/span&gt;&lt;span class="kwrd"&gt;='true'&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;='server'&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;span class="attr"&gt;&amp;amp;lt;&lt;/span&gt;/umbraco:Item&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&amp;quot; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;head&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&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;The Cause:
&lt;/h4&gt;
&lt;p&gt;
When I took a detailed look on this issue I saw that the head tag in my template had
a Runat=&amp;quot;Server&amp;quot; attribute. When I removed this attribute the output was
rendered fine. I'm using a few Ajax Controls on forms that throws an error when it
can't find a Head tag with the Runat=&amp;quot;Server&amp;quot; attribute, so simply removing
it isn't the solution.
&lt;/p&gt;
&lt;h4&gt;The solution,&amp;#160; Macro's to the rescue:
&lt;/h4&gt;
&lt;p&gt;
With a Macro and an XSLT file this issue can easily be solved and after thinking of
it it's also a better solution because it's a better separation between HTML and ASP.Net
code. To solve it you just create a Macro that excepts two parameters (keywords and
description). Then create an XSLT file that outputs the values like this example:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;UTF-8&amp;quot;&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;!&lt;/span&gt;&lt;span class="html"&gt;DOCTYPE&lt;/span&gt; &lt;span class="attr"&gt;xsl:stylesheet&lt;/span&gt; [
&amp;amp;&lt;span class="attr"&gt;lt&lt;/span&gt;;!&lt;span class="attr"&gt;ENTITY&lt;/span&gt; &lt;span class="attr"&gt;nbsp&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;quot;&amp;amp;#x00A0;&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; ]&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;1.0&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xmlns:xsl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;http://www.w3.org/1999/XSL/Transform&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xmlns:msxml&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:schemas-microsoft-com:xslt&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;xmlns:umbraco&lt;/span&gt;.&lt;span class="attr"&gt;library&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;urn:umbraco.library&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;exclude-result-prefixes&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;msxml
umbraco.library&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:output&lt;/span&gt; &lt;span class="attr"&gt;method&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;xml&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;omit-xml-declaration&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;yes&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:param&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;currentPage&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:variable&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;keywords&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/macro/keywords&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:variable&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;description&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;select&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/macro/description&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt; &lt;span class="attr"&gt;match&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;meta&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;keywords&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{$keywords}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;meta&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;description&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;content&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;{$description}&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:template&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xsl:stylesheet&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&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;
Then use the Macro in your template:
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;umbraco:Macro&lt;/span&gt; &lt;span class="attr"&gt;keywords&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;[$metaKeywords]&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;description&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;[$metaDescription]&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;Alias&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;MetaTags&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;umbraco:Macro&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
Now you have exact the same functionality and it will work in any situation. Because
I'm using the $ sign before the fieldnames that are passed to the Umbraco. Umbraco
will do a recursive search for the values of those properties, just like the recursive
attribute does on the Umbraco:item tag.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=90e0ca4a-0e98-4962-9d86-5381d57e6ae7" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,90e0ca4a-0e98-4962-9d86-5381d57e6ae7.aspx</comments>
      <category>Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=f68469ce-f9b7-4354-913d-6c91d8cb318c</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,f68469ce-f9b7-4354-913d-6c91d8cb318c.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,f68469ce-f9b7-4354-913d-6c91d8cb318c.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=f68469ce-f9b7-4354-913d-6c91d8cb318c</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <title>Package Actions Contrib</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,f68469ce-f9b7-4354-913d-6c91d8cb318c.aspx</guid>
      <link>http://www.richardsoeteman.net/PermaLink,guid,f68469ce-f9b7-4354-913d-6c91d8cb318c.aspx</link>
      <pubDate>Tue, 03 Mar 2009 12:39:34 GMT</pubDate>
      <description>&lt;p&gt;
Last week &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=f68469ce-f9b7-4354-913d-6c91d8cb318c&amp;amp;url=http%3a%2f%2fwww.creativewebspecialist.co.uk%2f"" target="_blank"&gt;Warren
Buckley&lt;/a&gt; asked for a URL Rewrite Action to use in his awesome next version of the&amp;#160; &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=f68469ce-f9b7-4354-913d-6c91d8cb318c&amp;amp;url=http%3a%2f%2fumbracocws.codeplex.com%2f"" target="_blank"&gt;Umbraco
Creative Website Starter site&lt;/a&gt; (if Warren release it make sure you download it,
it's great!!). I was already thinking of creating some sort of packactions library
so I started working on that a little bit sooner (and more in a hurry) than expected.
The result is&amp;#160; a new &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=f68469ce-f9b7-4354-913d-6c91d8cb318c&amp;amp;url=http%3a%2f%2fwww.codeplex.com%2f"" target="_blank"&gt;Codeplex
project&lt;/a&gt; called &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=f68469ce-f9b7-4354-913d-6c91d8cb318c&amp;amp;url=http%3a%2f%2fpackageactioncontrib.codeplex.com%2f"" target="_blank"&gt;Package
Actions Contrib&lt;/a&gt; that will hopefully be used by the community and I'm also hoping
for a lot of contributors that will be part of this project.
&lt;/p&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h4&gt;Package Actions?
&lt;/h4&gt;
&lt;p&gt;
Package actions are great to include some custom functionality during the install
of your package, just by implementing the IPackageAction interface and the use of
Package XML in the package creator. &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=f68469ce-f9b7-4354-913d-6c91d8cb318c&amp;amp;url=http%3a%2f%2fumbraco.tv%2fassets%2fpackage%2520actions.pdf"&gt;This
PDF&lt;/a&gt; describes all default package actions that are included in the V4 release
of umbraco and it also describes how to use them. 
&lt;/p&gt;
&lt;h4&gt;AddUrlRewriteRule Action
&lt;/h4&gt;
&lt;p&gt;
Currently only one package action is included in the project. That is the AddUrlRewriteRule
Action. With the AddUrlRewriteRule&amp;#160; you can add a new rewrite rule to the UrlRewriting.config
file. The xml snippet below descibes the xml for adding the UrlRewrite rule to the
config file. The action element is the normal element that you must include for each
package action. The Alias is the alias that is used in the AddUrlRewriteRule class.
The undo option is implemented but will not work because of &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=f68469ce-f9b7-4354-913d-6c91d8cb318c&amp;amp;url=http%3a%2f%2fumbraco.codeplex.com%2fWorkItem%2fView.aspx%3fWorkItemId%3d21426"" target="_blank"&gt;this
bug&lt;/a&gt; I recently found. And the add element is what you normally will add manually
in the UrlRewriting.config file. 
&lt;/p&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;Action&lt;/span&gt; &lt;span class="attr"&gt;runat&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;install&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;undo&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;alias&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;AddUrlRewriteRule&amp;quot;&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;CWS_emaiAFriendID&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;virtualUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;^~/email-a-friend/(.[0-9]*).aspx&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;rewriteUrlParameter&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;ExcludeFromClientQueryString&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;destinationUrl&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;~/email-a-friend.aspx?nodeID=$1&amp;quot;&lt;/span&gt; &lt;span class="attr"&gt;ignoreCase&lt;/span&gt;&lt;span class="kwrd"&gt;=&amp;quot;true&amp;quot;&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt; &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;Action&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&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;
&lt;/h4&gt;
&lt;h6&gt;
&lt;/h6&gt;
&lt;p&gt;
What's next
&lt;/p&gt;
&lt;p&gt;
The next thing that will be added to the project is not a new action but it will be
a tool where you can test your package action and package action xml without actually
having to install a package. Instead you can upload the dll and enter the xml and
press the testbutton to validate that the action installed or uninstalled correctly
or what errors did occur. Also I like to have some documentation in the way that the
normal package actions are described.
&lt;/p&gt;
&lt;h4&gt;Contribute to the project
&lt;/h4&gt;
&lt;p&gt;
I think this project can only be a success with help from the community. So if you
have some really cool custom package action now that could be useful to share please
apply a patch on Codeplex or contact me by mail, also if you just have a great idea
that could be included in the project.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.richardsoeteman.net/ct.ashx?id=f68469ce-f9b7-4354-913d-6c91d8cb318c&amp;amp;url=http%3a%2f%2fpackageactioncontrib.codeplex.com%2f"" target="_blank"&gt;Click
here&lt;/a&gt; to visit the Codeplex project site. Hope to see some really nice package
actions included in the contrib.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=f68469ce-f9b7-4354-913d-6c91d8cb318c" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,f68469ce-f9b7-4354-913d-6c91d8cb318c.aspx</comments>
      <category>Package;Umbraco</category>
    </item>
    <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>
      <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/PermaLink,guid,f470b6cf-40da-4aa9-a0d9-7b984fe9bf59.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.richardsoeteman.net/ct.ashx?id=f470b6cf-40da-4aa9-a0d9-7b984fe9bf59&amp;amp;url=http%3a%2f%2fwww.umbraco.org%2f"" 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://www.richardsoeteman.net/ct.ashx?id=f470b6cf-40da-4aa9-a0d9-7b984fe9bf59&amp;amp;url=http%3a%2f%2fmsdn.microsoft.com%2fen-us%2flibrary%2fsystem.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.richardsoeteman.net/ct.ashx?id=f470b6cf-40da-4aa9-a0d9-7b984fe9bf59&amp;amp;url=http%3a%2f%2fwww.codeplex.com%2fumbraco%2fWorkItem%2fView.aspx%3fWorkItemId%3d21309"" 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;img alt=";-)" src="smilies/wink.gif"&gt;&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;img alt=";-)" src="smilies/wink.gif"&gt;&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/ct.ashx?id=f470b6cf-40da-4aa9-a0d9-7b984fe9bf59&amp;amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fdownloads%2fUmbraco%2funpublishmenuitem.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;Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=cef2bfbb-ca3d-4290-b956-9aeb1687f780</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,cef2bfbb-ca3d-4290-b956-9aeb1687f780.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,cef2bfbb-ca3d-4290-b956-9aeb1687f780.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=cef2bfbb-ca3d-4290-b956-9aeb1687f780</wfw:commentRss>
      <title>MacroPicker now on codeplex</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,cef2bfbb-ca3d-4290-b956-9aeb1687f780.aspx</guid>
      <link>http://www.richardsoeteman.net/PermaLink,guid,cef2bfbb-ca3d-4290-b956-9aeb1687f780.aspx</link>
      <pubDate>Tue, 10 Feb 2009 12:14:32 GMT</pubDate>
      <description>&lt;p&gt;
Last friday I've blogged about &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=cef2bfbb-ca3d-4290-b956-9aeb1687f780&amp;amp;url=http%3a%2f%2fwww.richardsoeteman.net%2fPermaLink%2cguid%2c1788222d-197c-4706-9c13-3b6ce5395866.aspx"" target="_blank"&gt;Macro
Picker&lt;/a&gt; and got a few emails asking to make the source available to make (small)
modifications. I'm very pleased to announce that the project is now available on &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=cef2bfbb-ca3d-4290-b956-9aeb1687f780&amp;amp;url=http%3a%2f%2fwww.codeplex.com%2fmacropicker"" target="_blank"&gt;Codeplex&lt;/a&gt;.&amp;#160;
The license is MIT now so you can basically do everything with it. You can find the
project on &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=cef2bfbb-ca3d-4290-b956-9aeb1687f780&amp;amp;url=http%3a%2f%2fwww.codeplex.com%2fmacropicker"" target="_blank"&gt;www.codeplex.com/macropicker&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=cef2bfbb-ca3d-4290-b956-9aeb1687f780" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,cef2bfbb-ca3d-4290-b956-9aeb1687f780.aspx</comments>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=1788222d-197c-4706-9c13-3b6ce5395866</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,1788222d-197c-4706-9c13-3b6ce5395866.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,1788222d-197c-4706-9c13-3b6ce5395866.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=1788222d-197c-4706-9c13-3b6ce5395866</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <title>MacroPicker Datatype</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,1788222d-197c-4706-9c13-3b6ce5395866.aspx</guid>
      <link>http://www.richardsoeteman.net/PermaLink,guid,1788222d-197c-4706-9c13-3b6ce5395866.aspx</link>
      <pubDate>Fri, 06 Feb 2009 16:24:22 GMT</pubDate>
      <description>&lt;p&gt;
Recently I started working with&amp;nbsp; &lt;a href="http://www.richardsoeteman.net/ct.ashx?id=1788222d-197c-4706-9c13-3b6ce5395866&amp;amp;url=http%3a%2f%2fwww.designrevolution.nl%2f"" target=_blank&gt;Design
Revolution&lt;/a&gt; as a partner on Umbraco projects. Together we released a few sites
and all these sites contained a section where a user can pick dynamic elements such
as overviews, map locations etc. To achieve this we've&amp;nbsp; created a few macro's
that contained functionality to display the correct information. For each section
where the user can select a macro we've&amp;nbsp; created a tab(overview1/overview2 etc)
with a Rich Text Editor to selected the macro. We came to the conclusion that this
isn't the best solution because we want to force site integrity and we came up with
the idea to create a datatype where a user can select a macro and fill in the macro
properties as normal Umbraco data fields.&amp;nbsp; 
&lt;/p&gt;
&lt;h3&gt;How it works
&lt;/h3&gt;
&lt;p&gt;
In the video below I will demonstrate how the datatype works. I've installed a clean
Umbraco installation with Runway and the following Runway modules installed
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Runway FAQ Module 
&lt;li&gt;
Runway JCarousel 
&lt;li&gt;
Standard Top Navigation 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I did modify the macro's a bit so that they accepted a content picker macro parameter
so we can list the selected folder instead of the current folder. When you want to
use the package it's good to know that you can use the normal syntax for a page item,
all options that you can choose on a normal Text datatype will also work on the Macro
Picker datatype.
&lt;/p&gt;
&lt;pre class=csharpcode&gt;&lt;span class=kwrd&gt;&amp;lt;&lt;/span&gt;&lt;span class=html&gt;umbraco:Item&lt;/span&gt; &lt;span class=attr&gt;field&lt;/span&gt;&lt;span class=kwrd&gt;="[YourfieldNameHere]"&lt;/span&gt; &lt;span class=attr&gt;runat&lt;/span&gt;&lt;span class=kwrd&gt;="server"&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=html&gt;umbraco:Item&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&lt;/span&gt;&lt;/pre&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;embed src=/screencast/MacroPicker.wmv type=video/x-ms-wmv&gt;&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=1788222d-197c-4706-9c13-3b6ce5395866" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,1788222d-197c-4706-9c13-3b6ce5395866.aspx</comments>
    </item>
  </channel>
</rss>