<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>RichardSoeteman.net</title>
    <link>http://www.richardsoeteman.net/</link>
    <description />
    <language>en-us</language>
    <copyright>Richard Soeteman</copyright>
    <lastBuildDate>Wed, 03 Feb 2010 15:45:02 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>richard@richardsoeteman.net</managingEditor>
    <webMaster>richard@richardsoeteman.net</webMaster>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=ca001b5a-93d9-456c-9b82-5b345d5a1b80</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,ca001b5a-93d9-456c-9b82-5b345d5a1b80.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,ca001b5a-93d9-456c-9b82-5b345d5a1b80.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=ca001b5a-93d9-456c-9b82-5b345d5a1b80</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just a small blogpost to announce that I’ve just made a new release of the Package
Action Contrib project. The following actions are added to the project:
</p>
        <ul>
          <li>
AddConfigurationSection 
</li>
          <li>
PermissionForApp 
</li>
          <li>
AddLanguageFileKey 
</li>
          <li>
MoveFile 
</li>
          <li>
UpdateAppTree 
</li>
        </ul>
        <p>
You can download the new release and documentation from <a href="http://packageactioncontrib.codeplex.com/" target="_blank">codeplex</a>.
I’ve also updated the WIKI page on <a title="Umbraco" href="http://our.umbraco.org/wiki/reference/packaging/package-actions/community-made-package-actions" target="_blank">our.umbraco.org</a>.
</p>
        <p>
          <br />
Many thanks to the contributors of this release, Simon Dingley, Chris Houston, Dirk
de Grave and Søren Spelling Lund for submitting their code!
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ca001b5a-93d9-456c-9b82-5b345d5a1b80" />
      </body>
      <title>Package Action Contrib 1.0.4</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,ca001b5a-93d9-456c-9b82-5b345d5a1b80.aspx</guid>
      <link>http://www.richardsoeteman.net/2010/02/03/PackageActionContrib104.aspx</link>
      <pubDate>Wed, 03 Feb 2010 15:45:02 GMT</pubDate>
      <description>&lt;p&gt;
Just a small blogpost to announce that I’ve just made a new release of the Package
Action Contrib project. The following actions are added to the project:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
AddConfigurationSection 
&lt;/li&gt;
&lt;li&gt;
PermissionForApp 
&lt;/li&gt;
&lt;li&gt;
AddLanguageFileKey 
&lt;/li&gt;
&lt;li&gt;
MoveFile 
&lt;/li&gt;
&lt;li&gt;
UpdateAppTree 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
You can download the new release and documentation from &lt;a href="http://packageactioncontrib.codeplex.com/" target="_blank"&gt;codeplex&lt;/a&gt;.
I’ve also updated the WIKI page on &lt;a title="Umbraco" href="http://our.umbraco.org/wiki/reference/packaging/package-actions/community-made-package-actions" target="_blank"&gt;our.umbraco.org&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;br /&gt;
Many thanks to the contributors of this release, Simon Dingley, Chris Houston, Dirk
de Grave and Søren Spelling Lund for submitting their code!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ca001b5a-93d9-456c-9b82-5b345d5a1b80" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,ca001b5a-93d9-456c-9b82-5b345d5a1b80.aspx</comments>
      <category>Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=24e1d561-1f6c-4411-bd62-584023d31df7</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,24e1d561-1f6c-4411-bd62-584023d31df7.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,24e1d561-1f6c-4411-bd62-584023d31df7.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=24e1d561-1f6c-4411-bd62-584023d31df7</wfw:commentRss>
      <slash:comments>4</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
This <a href="http://our.umbraco.org/forum/developers/extending-umbraco/6203-Add-new-parameter-types-to-Macros?p=0#comment22398" target="_blank">forum
post</a>  triggered me to share some code that I had. A while back I was building
a site which  let the customers define their own custom overviews One requirement
was that users could define the sort by property . To do this you can use the property
picker but it wasn’t friendly enough for my case so I ended up building a custom macro
parameter type. 
</p>
        <p>
To start you need to create a new class library and add references to the following
assemblies:
</p>
        <ul>
          <li>
Businesslogic 
</li>
          <li>
Cms 
</li>
          <li>
Interfaces 
</li>
          <li>
            <a title="Umbraco" href="http://www.umbraco.org." target="_blank">Umbraco</a>
          </li>
          <li>
System.web 
</li>
        </ul>
        <p>
In the example below I’ve created a class that inherits from dropdownlist. This was
the easiest way since I needed a dropdownlist and didn’t want to play with the control
tree, Now more important is that this class inherits from the <em>IMacroGuiRendering</em> Interface. 
This add two properties ShowCaption, to show the caption on the parameters tab and
more important value which holds the selected value .  
</p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> System.Collections.Generic;</pre>
          <pre>
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> System.Text;</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">using</span> System.Web.UI.WebControls;</pre>
          <pre>
            <span class="lnum"> 5: </span>
            <span class="kwrd">using</span> umbraco.interfaces;</pre>
          <pre>
            <span class="lnum"> 6: </span> </pre>
          <pre>
            <span class="lnum"> 7: </span>
            <span class="kwrd">namespace</span> MacroRenderDemo</pre>
          <pre>
            <span class="lnum"> 8: </span>{</pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> OrderBy
: DropDownList, IMacroGuiRendering</pre>
          <pre>
            <span class="lnum"> 10: </span> {</pre>
          <pre>
            <span class="lnum"> 11: </span>
            <span class="kwrd">protected</span>
            <span class="kwrd">override</span>
            <span class="kwrd">void</span> OnLoad(EventArgs
e)</pre>
          <pre>
            <span class="lnum"> 12: </span> {</pre>
          <pre>
            <span class="lnum"> 13: </span>
            <span class="kwrd">base</span>.OnLoad(e);</pre>
          <pre>
            <span class="lnum"> 14: </span>
            <span class="kwrd">if</span> (<span class="kwrd">this</span>.Items.Count
== 0)</pre>
          <pre>
            <span class="lnum"> 15: </span> {</pre>
          <pre>
            <span class="lnum"> 16: </span>
            <span class="kwrd">this</span>.Items.Add(<span class="kwrd">new</span> ListItem(<span class="str">"Title"</span>, <span class="str">"nodeName"</span>));</pre>
          <pre>
            <span class="lnum"> 17: </span>
            <span class="kwrd">this</span>.Items.Add(<span class="kwrd">new</span> ListItem(<span class="str">"Date"</span>, <span class="str">"createDate"</span>));</pre>
          <pre>
            <span class="lnum"> 18: </span> }</pre>
          <pre>
            <span class="lnum"> 19: </span> }</pre>
          <pre>
            <span class="lnum"> 20: </span> </pre>
          <pre>
            <span class="lnum"> 21: </span>
            <span class="preproc">#region</span> IMacroGuiRendering
Members</pre>
          <pre>
            <span class="lnum"> 22: </span> </pre>
          <pre>
            <span class="lnum"> 23: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">bool</span> ShowCaption</pre>
          <pre>
            <span class="lnum"> 24: </span> {</pre>
          <pre>
            <span class="lnum"> 25: </span> get { <span class="kwrd">return</span><span class="kwrd">true</span>;
}</pre>
          <pre>
            <span class="lnum"> 26: </span> }</pre>
          <pre>
            <span class="lnum"> 27: </span> </pre>
          <pre>
            <span class="lnum"> 28: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">string</span> Value</pre>
          <pre>
            <span class="lnum"> 29: </span> {</pre>
          <pre>
            <span class="lnum"> 30: </span> get</pre>
          <pre>
            <span class="lnum"> 31: </span> {</pre>
          <pre>
            <span class="lnum"> 32: </span>
            <span class="kwrd">return</span>
            <span class="kwrd">this</span>.SelectedValue;</pre>
          <pre>
            <span class="lnum"> 33: </span> }</pre>
          <pre>
            <span class="lnum"> 34: </span> set</pre>
          <pre>
            <span class="lnum"> 35: </span> {</pre>
          <pre>
            <span class="lnum"> 36: </span>
            <span class="kwrd">this</span>.SelectedValue
= <span class="kwrd">value</span>;</pre>
          <pre>
            <span class="lnum"> 37: </span> }</pre>
          <pre>
            <span class="lnum"> 38: </span> }</pre>
          <pre>
            <span class="lnum"> 39: </span> </pre>
          <pre>
            <span class="lnum"> 40: </span>
            <span class="preproc">#endregion</span>
          </pre>
          <pre>
            <span class="lnum"> 41: </span> }</pre>
          <pre>
            <span class="lnum"> 42: </span>}</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
When you build the project and add the binary into the bin folder of your Umbraco
site you still can’t select the new type from the parameter type list. First we need
to register the class  in the database. Below you’ll see the database table that
holds all the Macro property types.
</p>
        <p>
          <img title="dbrecords" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="378" alt="dbrecords" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Createacustommacroparametertype_1212C/dbrecords_25180f92-f0b8-4354-9f5c-704b8160735b.jpg" width="881" border="0" /> 
</p>
        <p>
It is important that you add the Assemblyname  including the namespace to the
macroPropertyTypeRenderAssembly column and add the name of your class to the 
macroPropertyTypeRenderAssembly column . 
</p>
        <p>
Now we can use the parameter in our macro’s
</p>
        <p>
          <img title="parameters" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="474" alt="parameters" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Createacustommacroparametertype_1212C/parameters_5296818b-a8b7-42b3-9a5a-eb9b46a229da.jpg" width="953" border="0" />
        </p>
        <p>
and off course we can now use the new parameter in our template when we select the
macro
</p>
        <p>
          <img title="InsertMacro" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="557" alt="InsertMacro" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Createacustommacroparametertype_1212C/InsertMacro_2202d017-5aa8-4afc-a633-6f67b2390cb6.jpg" width="472" border="0" />
        </p>
        <p>
Another example how flexible Umbraco is. If a requirement isn’t available out of the
box, usuallyall it takes is to implement an interface and write a few lines of code.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=24e1d561-1f6c-4411-bd62-584023d31df7" />
      </body>
      <title>Create a custom macro parameter type</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,24e1d561-1f6c-4411-bd62-584023d31df7.aspx</guid>
      <link>http://www.richardsoeteman.net/2010/01/04/CreateACustomMacroParameterType.aspx</link>
      <pubDate>Mon, 04 Jan 2010 21:37:53 GMT</pubDate>
      <description>&lt;p&gt;
This &lt;a href="http://our.umbraco.org/forum/developers/extending-umbraco/6203-Add-new-parameter-types-to-Macros?p=0#comment22398" target="_blank"&gt;forum
post&lt;/a&gt;&amp;#160; triggered me to share some code that I had. A while back I was building
a site which&amp;#160; let the customers define their own custom overviews One requirement
was that users could define the sort by property . To do this you can use the property
picker but it wasn’t friendly enough for my case so I ended up building a custom macro
parameter type. 
&lt;/p&gt;
&lt;p&gt;
To start you need to create a new class library and add references to the following
assemblies:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Businesslogic 
&lt;/li&gt;
&lt;li&gt;
Cms 
&lt;/li&gt;
&lt;li&gt;
Interfaces 
&lt;/li&gt;
&lt;li&gt;
&lt;a title="Umbraco" href="http://www.umbraco.org." target="_blank"&gt;Umbraco&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
System.web 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In the example below I’ve created a class that inherits from dropdownlist. This was
the easiest way since I needed a dropdownlist and didn’t want to play with the control
tree, Now more important is that this class inherits from the &lt;em&gt;IMacroGuiRendering&lt;/em&gt; Interface.&amp;#160;
This add two properties ShowCaption, to show the caption on the parameters tab and
more important value which holds the selected value .&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; 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; System.Web.UI.WebControls;&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.interfaces;&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; MacroRenderDemo&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; OrderBy
: DropDownList, IMacroGuiRendering&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;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnLoad(EventArgs
e)&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;base&lt;/span&gt;.OnLoad(e);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.Items.Count
== 0)&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; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; ListItem(&lt;span class="str"&gt;&amp;quot;Title&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;nodeName&amp;quot;&lt;/span&gt;));&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.Items.Add(&lt;span class="kwrd"&gt;new&lt;/span&gt; ListItem(&lt;span class="str"&gt;&amp;quot;Date&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;createDate&amp;quot;&lt;/span&gt;));&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;/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="preproc"&gt;#region&lt;/span&gt; IMacroGuiRendering
Members&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 22: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 23: &lt;/span&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; ShowCaption&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; get { &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
}&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;&amp;#160;&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;string&lt;/span&gt; Value&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; &lt;span class="kwrd"&gt;this&lt;/span&gt;.SelectedValue;&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; set&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;span class="kwrd"&gt;this&lt;/span&gt;.SelectedValue
= &lt;span class="kwrd"&gt;value&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;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 39: &lt;/span&gt;&amp;#160;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 40: &lt;/span&gt; &lt;span class="preproc"&gt;#endregion&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;/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;
When you build the project and add the binary into the bin folder of your Umbraco
site you still can’t select the new type from the parameter type list. First we need
to register the class&amp;#160; in the database. Below you’ll see the database table that
holds all the Macro property types.
&lt;/p&gt;
&lt;p&gt;
&lt;img title="dbrecords" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="378" alt="dbrecords" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Createacustommacroparametertype_1212C/dbrecords_25180f92-f0b8-4354-9f5c-704b8160735b.jpg" width="881" border="0" /&gt;&amp;#160;
&lt;/p&gt;
&lt;p&gt;
It is important that you add the Assemblyname&amp;#160; including the namespace to the
macroPropertyTypeRenderAssembly column and add the name of your class to the&amp;#160;
macroPropertyTypeRenderAssembly column . 
&lt;/p&gt;
&lt;p&gt;
Now we can use the parameter in our macro’s
&lt;/p&gt;
&lt;p&gt;
&lt;img title="parameters" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="474" alt="parameters" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Createacustommacroparametertype_1212C/parameters_5296818b-a8b7-42b3-9a5a-eb9b46a229da.jpg" width="953" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
and off course we can now use the new parameter in our template when we select the
macro
&lt;/p&gt;
&lt;p&gt;
&lt;img title="InsertMacro" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="557" alt="InsertMacro" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Createacustommacroparametertype_1212C/InsertMacro_2202d017-5aa8-4afc-a633-6f67b2390cb6.jpg" width="472" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Another example how flexible Umbraco is. If a requirement isn’t available out of the
box, usuallyall it takes is to implement an interface and write a few lines of code.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=24e1d561-1f6c-4411-bd62-584023d31df7" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,24e1d561-1f6c-4411-bd62-584023d31df7.aspx</comments>
      <category>Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=5cf8a3ee-a946-4802-9cea-a8acac814a97</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,5cf8a3ee-a946-4802-9cea-a8acac814a97.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,5cf8a3ee-a946-4802-9cea-a8acac814a97.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=5cf8a3ee-a946-4802-9cea-a8acac814a97</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Let’s start with wishing you all the best for 2010. 2009 was an insane year for me,
I had given myself one year  being successful in business running my own <a title="Umbraco" href="http://www.umbraco.org." target="_blank">Umbraco</a> 
projects instead of being a .net contractor. That turned out great, I’ve got a lot
of new customers, have build a few great sites for my customers  and did a few
Umbraco consulting jobs. So now it’s time to make plans for 2010.  First thing
is that I’m moving to a real office instead of working from home. I’m really excited
about this because I’m moving to an office building with lots of small companies,
I think that’s really inspiring. 
</p>
        <p>
When I’ve started investigating Umbraco back in 2008 we had a small amount of companies
in the Netherlands (mostly freelancers) that where building websites based on Umbraco.
Nowadays I see new companies that build Umbraco websites every week, not only small
shops but also really big agencies. For this year my focus will be on helping companies
(worldwide) being successful implementing Umbraco sites for their clients by offering
consultancy services and custom package development  instead of building sites
from front to end.
</p>
        <p>
As you might know I’m also working for a long time on <a href="http://umbimport.soetemansoftware.nl/" target="_blank">UmbImport
PRO</a>. My plan was to release this package last year. It’s the top prio on my todolist
for Q1 this year. Also another package will see the light this year, UmbLinkChecker.
As the name says this will be a package that checks every link in your published site,
not only in content but also hard coded links in your templates etc., I will build
a free and Pro version. Since Umbraco has more than 75000 active installs I think
it’s profitable to build commercial packages for Umbraco and we will see more and
more commercial packages from different vendors. Hope the Umbraco store will be back
up in 2010 and filled with great products.
</p>
        <p>
The last year I couldn’t find enough time to blog or write WIKI’s and helping the
community with their problems on the forum. I’m hoping this year that will change,
since I’ve got a lot of info that I’d like to share. 
</p>
        <p>
Have a great 2010!
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=5cf8a3ee-a946-4802-9cea-a8acac814a97" />
      </body>
      <title>Plans for 2010</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,5cf8a3ee-a946-4802-9cea-a8acac814a97.aspx</guid>
      <link>http://www.richardsoeteman.net/2010/01/02/PlansFor2010.aspx</link>
      <pubDate>Sat, 02 Jan 2010 09:34:32 GMT</pubDate>
      <description>&lt;p&gt;
Let’s start with wishing you all the best for 2010. 2009 was an insane year for me,
I had given myself one year&amp;#160; being successful in business running my own &lt;a title="Umbraco" href="http://www.umbraco.org." target="_blank"&gt;Umbraco&lt;/a&gt;&amp;#160;
projects instead of being a .net contractor. That turned out great, I’ve got a lot
of new customers, have build a few great sites for my customers&amp;#160; and did a few
Umbraco consulting jobs. So now it’s time to make plans for 2010.&amp;#160; First thing
is that I’m moving to a real office instead of working from home. I’m really excited
about this because I’m moving to an office building with lots of small companies,
I think that’s really inspiring. 
&lt;/p&gt;
&lt;p&gt;
When I’ve started investigating Umbraco back in 2008 we had a small amount of companies
in the Netherlands (mostly freelancers) that where building websites based on Umbraco.
Nowadays I see new companies that build Umbraco websites every week, not only small
shops but also really big agencies. For this year my focus will be on helping companies
(worldwide) being successful implementing Umbraco sites for their clients by offering
consultancy services and custom package development&amp;#160; instead of building sites
from front to end.
&lt;/p&gt;
&lt;p&gt;
As you might know I’m also working for a long time on &lt;a href="http://umbimport.soetemansoftware.nl/" target="_blank"&gt;UmbImport
PRO&lt;/a&gt;. My plan was to release this package last year. It’s the top prio on my todolist
for Q1 this year. Also another package will see the light this year, UmbLinkChecker.
As the name says this will be a package that checks every link in your published site,
not only in content but also hard coded links in your templates etc., I will build
a free and Pro version. Since Umbraco has more than 75000 active installs I think
it’s profitable to build commercial packages for Umbraco and we will see more and
more commercial packages from different vendors. Hope the Umbraco store will be back
up in 2010 and filled with great products.
&lt;/p&gt;
&lt;p&gt;
The last year I couldn’t find enough time to blog or write WIKI’s and helping the
community with their problems on the forum. I’m hoping this year that will change,
since I’ve got a lot of info that I’d like to share. 
&lt;/p&gt;
&lt;p&gt;
Have a great 2010!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=5cf8a3ee-a946-4802-9cea-a8acac814a97" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,5cf8a3ee-a946-4802-9cea-a8acac814a97.aspx</comments>
      <category>Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=43d3de2a-bec8-4a85-ae43-6e3f8375aff9</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,43d3de2a-bec8-4a85-ae43-6e3f8375aff9.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,43d3de2a-bec8-4a85-ae43-6e3f8375aff9.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=43d3de2a-bec8-4a85-ae43-6e3f8375aff9</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Usually I develop websites that require login functionality for one or more roles,
now this is all cool for my clients but it’s a nightmare for me because I simply can’t
remember all the login and passwords. To make my life and other developers life’s
a little bit easier I’ve developed the Memberswitcher package. This package let's
you easily login members and switch between members by simply selecting a member from
a pull down list instead of enter the username and password. It’s using a lower level
asp.net membership method to login the member based on the username and is fully compatible
with all the asp.net Membership controls. Also the methods to fill the Membergroup
and Member pulldowns are using Membership methods, so it will work with the <a title="Umbraco" href="http://www.umbraco.org." target="_blank">Umbraco</a> members
but also with other membership providers.
</p>
        <p>
Once installed, an extra macro is added to the list. In your template select the Memberswitcher
macro, optional specify a node to redirect to once logged in and that’s it. 
<br />
&lt;umbraco:Macro RedirectToNodeAfterLogin="" Alias="MemberSwitcher"
runat="server"&gt;&lt;/umbraco:Macro&gt;
</p>
        <p>
When you visit the website you’ll see the control in action. First select the Membergroup
and Member.
</p>
        <p>
          <img title="membershwitcher_1" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="431" alt="membershwitcher_1" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Memberswitcherpackage_7946/membershwitcher_1_d79dacdd-1d35-41cb-afef-540edf3b3c4e.png" width="923" border="0" />  
<br />
When you click the Login selected member button you’ll be logged in as you can see
in the following screenshot that is using the asp.net LoginStatus control.
</p>
        <p>
          <img title="membershwitcher_2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="438" alt="membershwitcher_2" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Memberswitcherpackage_7946/membershwitcher_2_2399ebbd-fa92-4774-9eff-12e027e19f70.png" width="906" border="0" />
        </p>
        <p>
Needless to say: 
<br /><strong>DO NOT USE THIS PACKAGE IN A PRODUCTION ENVIRONMENT!! </strong></p>
        <p>
Download the package <a href="http://our.umbraco.org/projects/memberswitcher" target="_blank">here</a></p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=43d3de2a-bec8-4a85-ae43-6e3f8375aff9" />
      </body>
      <title>Memberswitcher package</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,43d3de2a-bec8-4a85-ae43-6e3f8375aff9.aspx</guid>
      <link>http://www.richardsoeteman.net/2009/12/27/MemberswitcherPackage.aspx</link>
      <pubDate>Sun, 27 Dec 2009 07:37:27 GMT</pubDate>
      <description>&lt;p&gt;
Usually I develop websites that require login functionality for one or more roles,
now this is all cool for my clients but it’s a nightmare for me because I simply can’t
remember all the login and passwords. To make my life and other developers life’s
a little bit easier I’ve developed the Memberswitcher package. This package let's
you easily login members and switch between members by simply selecting a member from
a pull down list instead of enter the username and password. It’s using a lower level
asp.net membership method to login the member based on the username and is fully compatible
with all the asp.net Membership controls. Also the methods to fill the Membergroup
and Member pulldowns are using Membership methods, so it will work with the &lt;a title="Umbraco" href="http://www.umbraco.org." target="_blank"&gt;Umbraco&lt;/a&gt; members
but also with other membership providers.
&lt;/p&gt;
&lt;p&gt;
Once installed, an extra macro is added to the list. In your template select the Memberswitcher
macro, optional specify a node to redirect to once logged in and that’s it. 
&lt;br /&gt;
&amp;lt;umbraco:Macro RedirectToNodeAfterLogin=&amp;quot;&amp;quot; Alias=&amp;quot;MemberSwitcher&amp;quot;
runat=&amp;quot;server&amp;quot;&amp;gt;&amp;lt;/umbraco:Macro&amp;gt;
&lt;/p&gt;
&lt;p&gt;
When you visit the website you’ll see the control in action. First select the Membergroup
and Member.
&lt;/p&gt;
&lt;p&gt;
&lt;img title="membershwitcher_1" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="431" alt="membershwitcher_1" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Memberswitcherpackage_7946/membershwitcher_1_d79dacdd-1d35-41cb-afef-540edf3b3c4e.png" width="923" border="0" /&gt;&amp;#160; 
&lt;br /&gt;
When you click the Login selected member button you’ll be logged in as you can see
in the following screenshot that is using the asp.net LoginStatus control.
&lt;/p&gt;
&lt;p&gt;
&lt;img title="membershwitcher_2" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="438" alt="membershwitcher_2" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/Memberswitcherpackage_7946/membershwitcher_2_2399ebbd-fa92-4774-9eff-12e027e19f70.png" width="906" border="0" /&gt; 
&lt;/p&gt;
&lt;p&gt;
Needless to say: 
&lt;br /&gt;
&lt;strong&gt;DO NOT USE THIS PACKAGE IN A PRODUCTION ENVIRONMENT!! &lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Download the package &lt;a href="http://our.umbraco.org/projects/memberswitcher" target="_blank"&gt;here&lt;/a&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=43d3de2a-bec8-4a85-ae43-6e3f8375aff9" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,43d3de2a-bec8-4a85-ae43-6e3f8375aff9.aspx</comments>
      <category>Package</category>
      <category>Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=bdc34020-7c06-49ca-ae62-9c1b4cbbacbd</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,bdc34020-7c06-49ca-ae62-9c1b4cbbacbd.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,bdc34020-7c06-49ca-ae62-9c1b4cbbacbd.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=bdc34020-7c06-49ca-ae62-9c1b4cbbacbd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
A few weeks back I had this  issue when deploying a site. I needed to modify
a documenttype to add a few properties and after a few minutes an error was raised
and the only thing I could see when I deleted the property and saved the documenttype
again, or opened a document based on that document type was the following error message
(thanks Dan for the picture).  
</p>
        <p>
          <img title="error-delete (3)" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="345" alt="error-delete (3)" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/ObjectReferenceNotSetafteraddingordeleti_A407/error-delete%20(3)_2c661d11-e7ab-4a49-adc1-ab3776eb221a.jpg" width="640" border="0" />
        </p>
        <p>
Did I make a backup? ehh no, so I needed to fix this. Okay let’s look at  the
error message again. An Object reference not set error is thrown while deleting the
property. Love that <a title="Umbraco" href="http://www.umbraco.org." target="_blank">Umbraco</a> is
open source and I can have a look at the source code. Below you see the method that
is responsible for deleting the property from the documenttype.
</p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">void</span> delete()</pre>
          <pre>
            <span class="lnum"> 2: </span> {</pre>
          <pre>
            <span class="lnum"> 3: </span>
            <span class="rem">// flush cache</span>
          </pre>
          <pre>
            <span class="lnum"> 4: </span> FlushCache();</pre>
          <pre>
            <span class="lnum"> 5: </span> </pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="rem">// Delete all properties of
propertytype</span>
          </pre>
          <pre>
            <span class="lnum"> 7: </span>
            <span class="kwrd">foreach</span>(Content c <span class="kwrd">in</span> Content.getContentOfContentType(<span class="kwrd">new</span> ContentType(_contenttypeid)))</pre>
          <pre>
            <span class="lnum"> 8: </span> {</pre>
          <pre>
            <span class="lnum"> 9: </span> c.getProperty(<span class="kwrd">this</span>).delete();</pre>
          <pre>
            <span class="lnum"> 10: </span> }</pre>
          <pre>
            <span class="lnum"> 11: </span>
            <span class="rem">// Delete PropertyType ..</span>
          </pre>
          <pre>
            <span class="lnum"> 12: </span> SqlHelper.ExecuteNonQuery(<span class="str">"Delete
from cmsPropertyType where id = "</span> + <span class="kwrd">this</span>.Id);</pre>
          <pre>
            <span class="lnum"> 13: </span>
            <span class="kwrd">this</span>.InvalidateCache();</pre>
          <pre>
            <span class="lnum"> 14: </span> }</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
As you might have seen there is no check for null values on the 9 (c.getProperty(<span class="kwrd">this</span>).delete();).
This is what caused the error while deleting the property. I assume it's sort of the
same issue when opening a document. Now that I know this I can work on a solution.
As I mentioned earlier, I needed to add properties to the document type. Below you
find the code I’ve used to do that. 
</p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span> ContentType ct = ContentType.GetByAlias(<span class="str">"_advertiser"</span>);</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">foreach</span> (PropertyType
i <span class="kwrd">in</span> ct.PropertyTypes)</pre>
          <pre>
            <span class="lnum"> 3: </span> {</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">if</span> (i.Alias == <span class="str">"linkToSpecial"</span>)</pre>
          <pre>
            <span class="lnum"> 5: </span> {</pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="rem">// Delete all properties of
propertytype</span>
          </pre>
          <pre>
            <span class="lnum"> 7: </span>
            <span class="kwrd">foreach</span> (umbraco.cms.businesslogic.Content
c <span class="kwrd">in</span> umbraco.cms.businesslogic.Content.getContentOfContentType(ct))</pre>
          <pre>
            <span class="lnum"> 8: </span> {</pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="kwrd">if</span> (c.getProperty(<span class="str">"linkToSpecial"</span>)
== <span class="kwrd">null</span>)</pre>
          <pre>
            <span class="lnum"> 10: </span> {</pre>
          <pre>
            <span class="lnum"> 11: </span> c.addProperty(i, c.Version);</pre>
          <pre>
            <span class="lnum"> 12: </span> c.Save();</pre>
          <pre>
            <span class="lnum"> 13: </span> }</pre>
          <pre>
            <span class="lnum"> 14: </span> }</pre>
          <pre>
            <span class="lnum"> 15: </span>
            <span class="rem">//Remove comment to delete
the property from the doctype</span>
          </pre>
          <pre>
            <span class="lnum"> 16: </span>
            <span class="rem">//i.delete();</span>
          </pre>
          <pre>
            <span class="lnum"> 17: </span>
            <span class="rem">//ct.Save();</span>
          </pre>
          <pre>
            <span class="lnum"> 18: </span> }</pre>
          <pre>
            <span class="lnum"> 19: </span> }</pre>
        </div>
        <style type="text/css">

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
As you can see, I’ve used a  few hard coded values. <strong>_advertiser</strong> is
the alias of the document type and <strong>linkToSpecial</strong> is the alias of
the property that I wanted to add on the Document type. If you want to delete the
property  remove  lines 9-13 and remove the comment on line 16 and 17. You
can use this code in a usercontrol and use that usercontrol as a dashboard control. <strong>Needless
to say, this code comes without a warranty.</strong></p>
        <p>
I’ve added <a href="http://umbraco.codeplex.com/WorkItem/View.aspx?WorkItemId=24871" target="_blank">the
issue to codeplex</a>, please vote for it!. Hope this post is a nice work around for
the issue.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=bdc34020-7c06-49ca-ae62-9c1b4cbbacbd" />
      </body>
      <title>Fix Object reference not set error after adding or deleting a document property</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,bdc34020-7c06-49ca-ae62-9c1b4cbbacbd.aspx</guid>
      <link>http://www.richardsoeteman.net/2009/10/27/FixObjectReferenceNotSetErrorAfterAddingOrDeletingADocumentProperty.aspx</link>
      <pubDate>Tue, 27 Oct 2009 20:06:12 GMT</pubDate>
      <description>&lt;p&gt;
A few weeks back I had this&amp;#160; issue when deploying a site. I needed to modify
a documenttype to add a few properties and after a few minutes an error was raised
and the only thing I could see when I deleted the property and saved the documenttype
again, or opened a document based on that document type was the following error message
(thanks Dan for the picture).&amp;#160; 
&lt;/p&gt;
&lt;p&gt;
&lt;img title="error-delete (3)" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="345" alt="error-delete (3)" src="http://www.richardsoeteman.net/content/binary/WindowsLiveWriter/ObjectReferenceNotSetafteraddingordeleti_A407/error-delete%20(3)_2c661d11-e7ab-4a49-adc1-ab3776eb221a.jpg" width="640" border="0" /&gt;
&lt;/p&gt;
&lt;p&gt;
Did I make a backup? ehh no, so I needed to fix this. Okay let’s look at&amp;#160; the
error message again. An Object reference not set error is thrown while deleting the
property. Love that &lt;a title="Umbraco" href="http://www.umbraco.org." target="_blank"&gt;Umbraco&lt;/a&gt; is
open source and I can have a look at the source code. Below you see the method that
is responsible for deleting the property from the documenttype.
&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;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; delete()&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="rem"&gt;// flush cache&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt; FlushCache();&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="rem"&gt;// Delete all properties of
propertytype&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt;(Content c &lt;span class="kwrd"&gt;in&lt;/span&gt; Content.getContentOfContentType(&lt;span class="kwrd"&gt;new&lt;/span&gt; ContentType(_contenttypeid)))&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; c.getProperty(&lt;span class="kwrd"&gt;this&lt;/span&gt;).delete();&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;// Delete PropertyType ..&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; SqlHelper.ExecuteNonQuery(&lt;span class="str"&gt;&amp;quot;Delete
from cmsPropertyType where id = &amp;quot;&lt;/span&gt; + &lt;span class="kwrd"&gt;this&lt;/span&gt;.Id);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 13: &lt;/span&gt; &lt;span class="kwrd"&gt;this&lt;/span&gt;.InvalidateCache();&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 14: &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;
As you might have seen there is no check for null values on the 9 (c.getProperty(&lt;span class="kwrd"&gt;this&lt;/span&gt;).delete();).
This is what caused the error while deleting the property. I assume it's sort of the
same issue when opening a document. Now that I know this I can work on a solution.
As I mentioned earlier, I needed to add properties to the document type. Below you
find the code I’ve used to do that. 
&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 1: &lt;/span&gt; ContentType ct = ContentType.GetByAlias(&lt;span class="str"&gt;&amp;quot;_advertiser&amp;quot;&lt;/span&gt;);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 2: &lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (PropertyType
i &lt;span class="kwrd"&gt;in&lt;/span&gt; ct.PropertyTypes)&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 3: &lt;/span&gt; {&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 4: &lt;/span&gt; &lt;span class="kwrd"&gt;if&lt;/span&gt; (i.Alias == &lt;span class="str"&gt;&amp;quot;linkToSpecial&amp;quot;&lt;/span&gt;)&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;// Delete all properties of
propertytype&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 7: &lt;/span&gt; &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (umbraco.cms.businesslogic.Content
c &lt;span class="kwrd"&gt;in&lt;/span&gt; umbraco.cms.businesslogic.Content.getContentOfContentType(ct))&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;if&lt;/span&gt; (c.getProperty(&lt;span class="str"&gt;&amp;quot;linkToSpecial&amp;quot;&lt;/span&gt;)
== &lt;span class="kwrd"&gt;null&lt;/span&gt;)&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; c.addProperty(i, c.Version);&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 12: &lt;/span&gt; c.Save();&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;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 15: &lt;/span&gt; &lt;span class="rem"&gt;//Remove comment to delete
the property from the doctype&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 16: &lt;/span&gt; &lt;span class="rem"&gt;//i.delete();&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt; 17: &lt;/span&gt; &lt;span class="rem"&gt;//ct.Save();&lt;/span&gt;&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;/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;
As you can see, I’ve used a&amp;#160; few hard coded values. &lt;strong&gt;_advertiser&lt;/strong&gt; is
the alias of the document type and &lt;strong&gt;linkToSpecial&lt;/strong&gt; is the alias of
the property that I wanted to add on the Document type. If you want to delete the
property&amp;#160; remove&amp;#160; lines 9-13 and remove the comment on line 16 and 17. You
can use this code in a usercontrol and use that usercontrol as a dashboard control. &lt;strong&gt;Needless
to say, this code comes without a warranty.&lt;/strong&gt; 
&lt;/p&gt;
&lt;p&gt;
I’ve added &lt;a href="http://umbraco.codeplex.com/WorkItem/View.aspx?WorkItemId=24871" target="_blank"&gt;the
issue to codeplex&lt;/a&gt;, please vote for it!. Hope this post is a nice work around for
the issue.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=bdc34020-7c06-49ca-ae62-9c1b4cbbacbd" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,bdc34020-7c06-49ca-ae62-9c1b4cbbacbd.aspx</comments>
      <category>Umbraco</category>
    </item>
    <item>
      <trackback:ping>http://www.richardsoeteman.net/Trackback.aspx?guid=deef886b-bb23-4fa3-8efd-07bf9c7a4140</trackback:ping>
      <pingback:server>http://www.richardsoeteman.net/pingback.aspx</pingback:server>
      <pingback:target>http://www.richardsoeteman.net/PermaLink,guid,deef886b-bb23-4fa3-8efd-07bf9c7a4140.aspx</pingback:target>
      <dc:creator>Richard Soeteman</dc:creator>
      <wfw:comment>http://www.richardsoeteman.net/CommentView,guid,deef886b-bb23-4fa3-8efd-07bf9c7a4140.aspx</wfw:comment>
      <wfw:commentRss>http://www.richardsoeteman.net/SyndicationService.asmx/GetEntryCommentsRss?guid=deef886b-bb23-4fa3-8efd-07bf9c7a4140</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
Just a little quick tip. When you install Umbraco v4.0.2.1 (don't know about other
versions) without runway and you publish your site, you will see a blank screen. This
is because the data/umbraco.config file contains the runway site as you can see in
the sample xml below.  
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;!</span>
          <span class="html">DOCTYPE</span>
          <span class="attr">umbraco</span>[
&amp;<span class="attr">lt</span>;!<span class="attr">ELEMENT</span><span class="attr">nodes</span><span class="attr">ANY</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;!</span><span class="html">ELEMENT</span><span class="attr">node</span><span class="attr">ANY</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;!</span><span class="html">ATTLIST</span><span class="attr">node</span><span class="attr">id</span><span class="attr">ID</span> #<span class="attr">REQUIRED</span><span class="kwrd">&gt;</span> ]<span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">root</span><span class="attr">id</span><span class="kwrd">="-1"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">node</span><span class="attr">id</span><span class="kwrd">="1048"</span><span class="attr">version</span><span class="kwrd">="6f0d47e7-8cf1-43e5-a5ad-c687e0b78331"</span><span class="attr">parentID</span><span class="kwrd">="-1"</span><span class="attr">level</span><span class="kwrd">="1"</span><span class="attr">writerID</span><span class="kwrd">="0"</span><br /><span class="attr">creatorID</span><span class="kwrd">="0"</span><span class="attr">nodeType</span><span class="kwrd">="1045"</span><span class="attr">template</span><span class="kwrd">="1042"</span><span class="attr">sortOrder</span><span class="kwrd">="2"</span><br /><span class="attr">createDate</span><span class="kwrd">="2008-05-02T09:52:36"</span><span class="attr">updateDate</span><span class="kwrd">="2009-02-18T10:19:26"</span><span class="attr">nodeName</span><span class="kwrd">="Runway
Homepage"</span><br /><span class="attr">urlName</span><span class="kwrd">="runway-homepage"</span><span class="attr">writerName</span><span class="kwrd">="Administrator"</span><br /><span class="attr">creatorName</span><span class="kwrd">="Administrator"</span><span class="attr">nodeTypeAlias</span><span class="kwrd">="RunwayHomepage"</span><span class="attr">path</span><span class="kwrd">="-1,1048"</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">data</span><span class="attr">alias</span><span class="kwrd">="bodyText"</span><span class="kwrd">&gt;&lt;!</span>[CDATA[<span class="kwrd">&lt;</span><span class="html">p</span><span class="kwrd">&gt;</span>Runway
gives you a bare-bones website that introduces you to a set of 
<br />
well-defined conventions for building an umbraco website.<span class="kwrd">&lt;/</span><span class="html">p</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">p</span><span class="kwrd">&gt;</span>The
Runway website is very simple in form and provided without any design or functionality. 
<br />
By installing Runway, you<span class="attr">&amp;rsquo;<br /></span>ll begin with a minimal site built on best practices. You<span class="attr">&amp;rsquo;</span>ll
also enjoy the benefits of 
<br />
speaking the same <span class="attr">&amp;ldquo;</span>language<span class="attr">&amp;rdquo;</span><br />
as the rest of the umbraco community by using common properties and naming conventions.<span class="kwrd">&lt;/</span><span class="html">p</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">p</span><span class="kwrd">&gt;</span>Now
that you know what Runway is, it is time to get started using Runway.<span class="kwrd">&lt;/</span><span class="html">p</span><span class="kwrd">&gt;</span>]]<span class="kwrd">&gt;&lt;/</span><span class="html">data</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">data</span><span class="attr">alias</span><span class="kwrd">="siteName"</span><span class="kwrd">&gt;</span>Runway<span class="kwrd">&lt;/</span><span class="html">data</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;</span><span class="html">data</span><span class="attr">alias</span><span class="kwrd">="siteDescription"</span><span class="kwrd">&gt;&lt;!</span>[CDATA[Off
to a great start]]<span class="kwrd">&gt;&lt;/</span><span class="html">data</span><span class="kwrd">&gt;</span> ..................... <span class="kwrd">&lt;/</span><span class="html">node</span><span class="kwrd">&gt;</span><span class="kwrd">&lt;/</span><span class="html">root</span><span class="kwrd">&gt;</span></pre>
        <p>
          <span class="kwrd">Work around for this issue is to republish the entire site first.
I've added this issue to codeplex. <a href="http://umbraco.codeplex.com/WorkItem/View.aspx?WorkItemId=24176" target="_blank">Please
vote here</a>.</span>
        </p>
        <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>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=deef886b-bb23-4fa3-8efd-07bf9c7a4140" />
      </body>
      <title>Empty site when using Umbraco v4.0.2.1 without runway</title>
      <guid isPermaLink="false">http://www.richardsoeteman.net/PermaLink,guid,deef886b-bb23-4fa3-8efd-07bf9c7a4140.aspx</guid>
      <link>http://www.richardsoeteman.net/2009/08/10/EmptySiteWhenUsingUmbracoV4021WithoutRunway.aspx</link>
      <pubDate>Mon, 10 Aug 2009 18:18:04 GMT</pubDate>
      <description>&lt;p&gt;
Just a little quick tip. When you install Umbraco v4.0.2.1 (don't know about other
versions) without runway and you publish your site, you will see a blank screen. This
is because the data/umbraco.config file contains the runway site as you can see in
the sample xml below.&amp;nbsp; 
&lt;/p&gt;
&lt;pre class=csharpcode&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;umbraco&lt;/span&gt;[
&amp;amp;&lt;span class=attr&gt;lt&lt;/span&gt;;!&lt;span class=attr&gt;ELEMENT&lt;/span&gt; &lt;span class=attr&gt;nodes&lt;/span&gt; &lt;span class=attr&gt;ANY&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;ELEMENT&lt;/span&gt; &lt;span class=attr&gt;node&lt;/span&gt; &lt;span class=attr&gt;ANY&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;ATTLIST&lt;/span&gt; &lt;span class=attr&gt;node&lt;/span&gt; &lt;span class=attr&gt;id&lt;/span&gt; &lt;span class=attr&gt;ID&lt;/span&gt; #&lt;span class=attr&gt;REQUIRED&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;root&lt;/span&gt; &lt;span class=attr&gt;id&lt;/span&gt;&lt;span class=kwrd&gt;="-1"&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;node&lt;/span&gt; &lt;span class=attr&gt;id&lt;/span&gt;&lt;span class=kwrd&gt;="1048"&lt;/span&gt; &lt;span class=attr&gt;version&lt;/span&gt;&lt;span class=kwrd&gt;="6f0d47e7-8cf1-43e5-a5ad-c687e0b78331"&lt;/span&gt; &lt;span class=attr&gt;parentID&lt;/span&gt;&lt;span class=kwrd&gt;="-1"&lt;/span&gt; &lt;span class=attr&gt;level&lt;/span&gt;&lt;span class=kwrd&gt;="1"&lt;/span&gt; &lt;span class=attr&gt;writerID&lt;/span&gt;&lt;span class=kwrd&gt;="0"&lt;/span&gt; 
&lt;br&gt;
&lt;span class=attr&gt;creatorID&lt;/span&gt;&lt;span class=kwrd&gt;="0"&lt;/span&gt; &lt;span class=attr&gt;nodeType&lt;/span&gt;&lt;span class=kwrd&gt;="1045"&lt;/span&gt; &lt;span class=attr&gt;template&lt;/span&gt;&lt;span class=kwrd&gt;="1042"&lt;/span&gt; &lt;span class=attr&gt;sortOrder&lt;/span&gt;&lt;span class=kwrd&gt;="2"&lt;/span&gt; 
&lt;br&gt;
&lt;span class=attr&gt;createDate&lt;/span&gt;&lt;span class=kwrd&gt;="2008-05-02T09:52:36"&lt;/span&gt; &lt;span class=attr&gt;updateDate&lt;/span&gt;&lt;span class=kwrd&gt;="2009-02-18T10:19:26"&lt;/span&gt; &lt;span class=attr&gt;nodeName&lt;/span&gt;&lt;span class=kwrd&gt;="Runway
Homepage"&lt;/span&gt; 
&lt;br&gt;
&lt;span class=attr&gt;urlName&lt;/span&gt;&lt;span class=kwrd&gt;="runway-homepage"&lt;/span&gt; &lt;span class=attr&gt;writerName&lt;/span&gt;&lt;span class=kwrd&gt;="Administrator"&lt;/span&gt; 
&lt;br&gt;
&lt;span class=attr&gt;creatorName&lt;/span&gt;&lt;span class=kwrd&gt;="Administrator"&lt;/span&gt; &lt;span class=attr&gt;nodeTypeAlias&lt;/span&gt;&lt;span class=kwrd&gt;="RunwayHomepage"&lt;/span&gt; &lt;span class=attr&gt;path&lt;/span&gt;&lt;span class=kwrd&gt;="-1,1048"&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;data&lt;/span&gt; &lt;span class=attr&gt;alias&lt;/span&gt;&lt;span class=kwrd&gt;="bodyText"&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&amp;lt;!&lt;/span&gt;[CDATA[&lt;span class=kwrd&gt;&amp;lt;&lt;/span&gt;&lt;span class=html&gt;p&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&lt;/span&gt;Runway
gives you a bare-bones website that introduces you to a set of 
&lt;br&gt;
well-defined conventions for building an umbraco website.&lt;span class=kwrd&gt;&amp;lt;/&lt;/span&gt;&lt;span class=html&gt;p&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;p&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&lt;/span&gt;The
Runway website is very simple in form and provided without any design or functionality. 
&lt;br&gt;
By installing Runway, you&lt;span class=attr&gt;&amp;amp;rsquo;&lt;br&gt;
&lt;/span&gt;ll begin with a minimal site built on best practices. You&lt;span class=attr&gt;&amp;amp;rsquo;&lt;/span&gt;ll
also enjoy the benefits of 
&lt;br&gt;
speaking the same &lt;span class=attr&gt;&amp;amp;ldquo;&lt;/span&gt;language&lt;span class=attr&gt;&amp;amp;rdquo;&lt;/span&gt; 
&lt;br&gt;
as the rest of the umbraco community by using common properties and naming conventions.&lt;span class=kwrd&gt;&amp;lt;/&lt;/span&gt;&lt;span class=html&gt;p&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;p&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&lt;/span&gt;Now
that you know what Runway is, it is time to get started using Runway.&lt;span class=kwrd&gt;&amp;lt;/&lt;/span&gt;&lt;span class=html&gt;p&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&lt;/span&gt;]]&lt;span class=kwrd&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=html&gt;data&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;data&lt;/span&gt; &lt;span class=attr&gt;alias&lt;/span&gt;&lt;span class=kwrd&gt;="siteName"&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&lt;/span&gt;Runway&lt;span class=kwrd&gt;&amp;lt;/&lt;/span&gt;&lt;span class=html&gt;data&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;data&lt;/span&gt; &lt;span class=attr&gt;alias&lt;/span&gt;&lt;span class=kwrd&gt;="siteDescription"&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&amp;lt;!&lt;/span&gt;[CDATA[Off
to a great start]]&lt;span class=kwrd&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class=html&gt;data&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;node&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;root&lt;/span&gt;&lt;span class=kwrd&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;span class=kwrd&gt;Work around for this issue is to republish the entire site first.
I've added this issue to codeplex. &lt;a href="http://umbraco.codeplex.com/WorkItem/View.aspx?WorkItemId=24176" target=_blank&gt;Please
vote here&lt;/a&gt;.&lt;/span&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;img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=deef886b-bb23-4fa3-8efd-07bf9c7a4140" /&gt;</description>
      <comments>http://www.richardsoeteman.net/CommentView,guid,deef886b-bb23-4fa3-8efd-07bf9c7a4140.aspx</comments>
      <category>Umbraco</category>
    </item>
    <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>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
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:
</p>
        <p>
UmbImport helps you import content or members from any datasource into <a href="http://www.umbraco.org">Umbraco</a>.
The following datasources are supported by default: 
</p>
        <ul>
          <li>
SQL Server 
</li>
          <li>
CSV file 
</li>
          <li>
XML file 
</li>
        </ul>
        <p>
You can also create your own custom DataAdapter. Check out the following links to
screencasts to see the power of UmbImport.  
</p>
        <ul>
          <li>
            <a href="http://www.richardsoeteman.net/PermaLink,guid,189035af-bbc0-4d3f-8d54-9782c06794e7.aspx">Import
content  </a>
          </li>
          <li>
            <a href="http://www.vimeo.com/3853997">Import members</a>
          </li>
        </ul>
        <p>
The package is added to <a href="http://our.umbraco.org/" target="_blank">our.umbraco.org</a> the
new <a title="Umbraco" href="http://www.umbraco.org" target="_blank">Umbraco</a> community
site , so you can <a href="http://our.umbraco.org/projects/umbimport" target="_blank">download</a> it
there or use the <a href="http://umbimport.soetemansoftware.nl/" target="_blank">UmbImport</a> site.
On <a href="http://our.umbraco.org/" target="_blank">our.umbraco.org</a> 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.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=79b35431-6f38-43e6-ae34-3a3e428892d5" />
      </body>
      <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/2009/06/30/UmbImportV1Released.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.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/PermaLink,guid,189035af-bbc0-4d3f-8d54-9782c06794e7.aspx"&gt;Import
content&amp;#160; &lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://www.vimeo.com/3853997"&gt;Import members&lt;/a&gt; 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The package is added to &lt;a href="http://our.umbraco.org/" target="_blank"&gt;our.umbraco.org&lt;/a&gt; the
new &lt;a title="Umbraco" href="http://www.umbraco.org" target="_blank"&gt;Umbraco&lt;/a&gt; community
site , so you can &lt;a href="http://our.umbraco.org/projects/umbimport" target="_blank"&gt;download&lt;/a&gt; it
there or use the &lt;a href="http://umbimport.soetemansoftware.nl/" target="_blank"&gt;UmbImport&lt;/a&gt; site.
On &lt;a href="http://our.umbraco.org/" 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</category>
      <category>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>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
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.
</p>
        <p>
 <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" /></p>
        <p>
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 <strong>node.Menu!= </strong><span class="kwrd"><strong>null </strong>check
and now everything is working fine.</span></p>
        <p>
 
</p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> umbraco.BusinessLogic;</pre>
          <pre>
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> umbraco.cms.presentation.Trees;</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">using</span> umbraco.interfaces;</pre>
          <pre>
            <span class="lnum"> 5: </span> </pre>
          <pre>
            <span class="lnum"> 6: </span>
            <span class="kwrd">namespace</span> UnpublishAction</pre>
          <pre>
            <span class="lnum"> 7: </span>{</pre>
          <pre>
            <span class="lnum"> 8: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="rem">/// Add unpublish to the menu
item</span>
          </pre>
          <pre>
            <span class="lnum"> 10: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 11: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> AddUnpublishActionEvent
:ApplicationBase</pre>
          <pre>
            <span class="lnum"> 12: </span> {</pre>
          <pre>
            <span class="lnum"> 13: </span>
            <span class="kwrd">public</span> AddUnpublishActionEvent()</pre>
          <pre>
            <span class="lnum"> 14: </span> {</pre>
          <pre>
            <span class="lnum"> 15: </span> BaseContentTree.BeforeNodeRender += <span class="kwrd">new</span> BaseTree.BeforeNodeRenderEventHandler(BaseTree_BeforeNodeRender);</pre>
          <pre>
            <span class="lnum"> 16: </span> }</pre>
          <pre>
            <span class="lnum"> 17: </span> </pre>
          <pre>
            <span class="lnum"> 18: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 19: </span>
            <span class="rem">/// Before a menu item gets
rendered we will add the unpublish action if the document is published</span>
          </pre>
          <pre>
            <span class="lnum"> 20: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 21: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> BaseTree_BeforeNodeRender(<span class="kwrd">ref</span> XmlTree
sender, <span class="kwrd">ref</span> XmlTreeNode node, EventArgs e)</pre>
          <pre>
            <span class="lnum"> 22: </span> {</pre>
          <pre>
            <span class="lnum"> 23: </span>
            <span class="rem">///Only unpublish when published</span>
          </pre>
          <pre>
            <span class="lnum"> 24: </span>
            <span class="kwrd">if</span> (<strong>node.Menu!= <span class="kwrd">null</span></strong> &amp;&amp;
!node.NotPublished.GetValueOrDefault(<span class="kwrd">true</span>))</pre>
          <pre>
            <span class="lnum"> 25: </span> {</pre>
          <pre>
            <span class="lnum"> 26: </span>
            <span class="rem">//Find the publish action and
add 1 for the index</span>
          </pre>
          <pre>
            <span class="lnum"> 27: </span>
            <span class="kwrd">int</span> index = node.Menu.FindIndex(<span class="kwrd">delegate</span>(IAction
a) { <span class="kwrd">return</span> a.Alias == <span class="str">"publish"</span>;
})+1;</pre>
          <pre>
            <span class="lnum"> 28: </span> </pre>
          <pre>
            <span class="lnum"> 29: </span>
            <span class="rem">//Insert unpublish action</span>
          </pre>
          <pre>
            <span class="lnum"> 30: </span> node.Menu.Insert(index, UnpublishAction.Instance);</pre>
          <pre>
            <span class="lnum"> 31: </span> }</pre>
          <pre>
            <span class="lnum"> 32: </span> }</pre>
          <pre>
            <span class="lnum"> 33: </span> }</pre>
          <pre>
            <span class="lnum"> 34: </span>}</pre>
          <pre>
            <span class="lnum"> 35: </span> </pre>
        </div>
        <style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <p>
          <a href="http://www.richardsoeteman.net/downloads/Umbraco/Unpublishmenuitem.zip" target="_blank">Download
Source</a>
        </p>
        <p>
Hope it didn't get you into trouble, sorry if it did.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=ec1b9387-aef3-47c9-86d8-eb9cb917baff" />
      </body>
      <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/2009/05/04/UpdateAddingMenuItemsUsingTheEventSystem.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/downloads/Umbraco/Unpublishmenuitem.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>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
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.  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 <a href="http://umbraco.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=18661" target="_blank">Umbraco
4.0.1</a> and the packages <a href="http://www.codeplex.com/blog4umbraco" target="_blank">Blog4Umbraco</a> and <a href="http://umbimport.soetemansoftware.nl/" target="_blank">UmbImport
beta 1</a>. 
</p>
        <h4>Create the adapter
</h4>
        <p>
You can create a custom data adapter by deriving from two classes:
</p>
        <ul>
          <li>
UmbImportLibrary.BaseTypes.ImportDataAdapter. 
</li>
          <li>
UmbImportLibrary.BaseTypes.ImportDataUI. 
</li>
        </ul>
        <p>
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. 
</p>
        <div class="csharpcode">
          <pre> </pre>
        </div>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> RSSDataAdapterUI
: ImportDataUI</pre>
          <pre>
            <span class="lnum"> 2: </span> {</pre>
          <pre>
            <span class="lnum"> 3: </span>
            <span class="kwrd">private</span> Panel _rssContentPanel
= <span class="kwrd">new</span> Panel();</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">private</span> Literal _selectRssSourceLiteral
= <span class="kwrd">new</span> Literal();</pre>
          <pre>
            <span class="lnum"> 5: </span>
            <span class="kwrd">private</span> TextBox _rssLocation
= <span class="kwrd">new</span> TextBox();</pre>
          <pre>
            <span class="lnum"> 6: </span> </pre>
          <pre>
            <span class="lnum"> 7: </span>
            <span class="kwrd">protected</span>
            <span class="kwrd">override</span>
            <span class="kwrd">void</span> OnInit(EventArgs
e)</pre>
          <pre>
            <span class="lnum"> 8: </span> {</pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="kwrd">base</span>.OnInit(e);</pre>
          <pre>
            <span class="lnum"> 10: </span> </pre>
          <pre>
            <span class="lnum"> 11: </span> _rssContentPanel.ID = <span class="str">"RssContentPanel"</span>;</pre>
          <pre>
            <span class="lnum"> 12: </span> _selectRssSourceLiteral.ID = <span class="str">"SelectRssSourceLiteral"</span>;</pre>
          <pre>
            <span class="lnum"> 13: </span> _selectRssSourceLiteral.Text = <span class="str">"Specify
the RSSLocation"</span>;</pre>
          <pre>
            <span class="lnum"> 14: </span> _rssLocation.ID = <span class="str">"RssLocation"</span>;</pre>
          <pre>
            <span class="lnum"> 15: </span> _rssLocation.Width = 400;</pre>
          <pre>
            <span class="lnum"> 16: </span> _rssContentPanel.Controls.Add(<span class="kwrd">new</span> LiteralControl(<span class="str">"&lt;table&gt;&lt;tr&gt;&lt;td
width=\"150\"&gt;"</span>));</pre>
          <pre>
            <span class="lnum"> 17: </span> _rssContentPanel.Controls.Add(_selectRssSourceLiteral);</pre>
          <pre>
            <span class="lnum"> 18: </span> _rssContentPanel.Controls.Add(<span class="kwrd">new</span> LiteralControl(<span class="str">"&lt;/td&gt;&lt;td&gt;"</span>));</pre>
          <pre>
            <span class="lnum"> 19: </span> _rssContentPanel.Controls.Add(_rssLocation);</pre>
          <pre>
            <span class="lnum"> 20: </span> _rssContentPanel.Controls.Add(<span class="kwrd">new</span> LiteralControl(<span class="str">"
example http://feeds.feedburner.com/umbracoblog &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;"</span>));</pre>
          <pre>
            <span class="lnum"> 21: </span> </pre>
          <pre>
            <span class="lnum"> 22: </span>
            <span class="kwrd">this</span>.Controls.Add(_rssContentPanel);</pre>
          <pre>
            <span class="lnum"> 23: </span> }</pre>
          <pre>
            <span class="lnum"> 24: </span> </pre>
          <pre>
            <span class="lnum"> 25: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 26: </span>
            <span class="rem">/// Returns the Datasource</span>
          </pre>
          <pre>
            <span class="lnum"> 27: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 28: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">override</span>
            <span class="kwrd">string</span> DataSource</pre>
          <pre>
            <span class="lnum"> 29: </span> {</pre>
          <pre>
            <span class="lnum"> 30: </span> get</pre>
          <pre>
            <span class="lnum"> 31: </span> {</pre>
          <pre>
            <span class="lnum"> 32: </span>
            <span class="kwrd">return</span> _rssLocation.Text;</pre>
          <pre>
            <span class="lnum"> 33: </span> </pre>
          <pre>
            <span class="lnum"> 34: </span> }</pre>
          <pre>
            <span class="lnum"> 35: </span> }</pre>
          <pre>
            <span class="lnum"> 36: </span> }</pre>
        </div>
        <style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <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>
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.
</p>
        <div class="csharpcode">
          <div class="csharpcode">
            <pre>
              <span class="lnum"> 1: </span>
              <span class="kwrd">public</span>
              <span class="kwrd">class</span> RSSDataAdapter
: ImportDataAdapter</pre>
            <pre>
              <span class="lnum"> 2: </span> {</pre>
            <pre>
              <span class="lnum"> 3: </span>
              <span class="kwrd">private</span> ImportDataUI
_xmlImportUI;</pre>
            <pre>
              <span class="lnum"> 4: </span> </pre>
            <pre>
              <span class="lnum"> 5: </span>
              <span class="rem">/// &lt;summary&gt;</span>
            </pre>
            <pre>
              <span class="lnum"> 6: </span>
              <span class="rem">/// Alias of the import adapter</span>
            </pre>
            <pre>
              <span class="lnum"> 7: </span>
              <span class="rem">/// &lt;/summary&gt;</span>
            </pre>
            <pre>
              <span class="lnum"> 8: </span>
              <span class="kwrd">public</span>
              <span class="kwrd">override</span>
              <span class="kwrd">string</span> Alias</pre>
            <pre>
              <span class="lnum"> 9: </span> {</pre>
            <pre>
              <span class="lnum"> 10: </span> get { <span class="kwrd">return</span><span class="str">"RssImport"</span>;
}</pre>
            <pre>
              <span class="lnum"> 11: </span> }</pre>
            <pre>
              <span class="lnum"> 12: </span> </pre>
            <pre>
              <span class="lnum"> 13: </span>
              <span class="rem">/// &lt;summary&gt;</span>
            </pre>
            <pre>
              <span class="lnum"> 14: </span>
              <span class="rem">/// Get XML Data</span>
            </pre>
            <pre>
              <span class="lnum"> 15: </span>
              <span class="rem">/// &lt;/summary&gt;</span>
            </pre>
            <pre>
              <span class="lnum"> 16: </span>
              <span class="rem">/// &lt;returns&gt;&lt;/returns&gt;</span>
            </pre>
            <pre>
              <span class="lnum"> 17: </span>
              <span class="kwrd">public</span>
              <span class="kwrd">override</span> IDataReader
GetData()</pre>
            <pre>
              <span class="lnum"> 18: </span> {</pre>
            <pre>
              <span class="lnum"> 19: </span>
              <span class="kwrd">return</span> XmlToDataReader(DataSource, <span class="str">"//item"</span>);</pre>
            <pre>
              <span class="lnum"> 20: </span> }</pre>
            <pre>
              <span class="lnum"> 21: </span> </pre>
            <pre>
              <span class="lnum"> 22: </span>
              <span class="rem">/// &lt;summary&gt;</span>
            </pre>
            <pre>
              <span class="lnum"> 23: </span>
              <span class="rem">/// Validates the selected
datasource</span>
            </pre>
            <pre>
              <span class="lnum"> 24: </span>
              <span class="rem">/// &lt;/summary&gt;</span>
            </pre>
            <pre>
              <span class="lnum"> 25: </span>
              <span class="kwrd">public</span>
              <span class="kwrd">override</span>
              <span class="kwrd">bool</span> Validate()</pre>
            <pre>
              <span class="lnum"> 26: </span> {</pre>
            <pre>
              <span class="lnum"> 27: </span>
              <span class="kwrd">bool</span> result = <span class="kwrd">false</span>;</pre>
            <pre>
              <span class="lnum"> 28: </span>
              <span class="kwrd">try</span>
            </pre>
            <pre>
              <span class="lnum"> 29: </span> {</pre>
            <pre>
              <span class="lnum"> 30: </span>
              <span class="kwrd">using</span> (IDataReader
datareader = XmlToDataReader(DataSource, <span class="str">"//item"</span>))</pre>
            <pre>
              <span class="lnum"> 31: </span> {</pre>
            <pre>
              <span class="lnum"> 32: </span> result = <span class="kwrd">true</span>;</pre>
            <pre>
              <span class="lnum"> 33: </span> }</pre>
            <pre>
              <span class="lnum"> 34: </span> }</pre>
            <pre>
              <span class="lnum"> 35: </span>
              <span class="kwrd">catch</span>
            </pre>
            <pre>
              <span class="lnum"> 36: </span> {</pre>
            <pre>
              <span class="lnum"> 37: </span> result = <span class="kwrd">false</span>;</pre>
            <pre>
              <span class="lnum"> 38: </span> }</pre>
            <pre>
              <span class="lnum"> 39: </span>
              <span class="kwrd">return</span> result;</pre>
            <pre>
              <span class="lnum"> 40: </span> }</pre>
            <pre>
              <span class="lnum"> 41: </span> </pre>
            <pre>
              <span class="lnum"> 42: </span>
              <span class="rem">/// &lt;summary&gt;</span>
            </pre>
            <pre>
              <span class="lnum"> 43: </span>
              <span class="rem">/// Holds a reference to the
UI control of the adapter</span>
            </pre>
            <pre>
              <span class="lnum"> 44: </span>
              <span class="rem">/// &lt;/summary&gt;</span>
            </pre>
            <pre>
              <span class="lnum"> 45: </span>
              <span class="kwrd">public</span>
              <span class="kwrd">override</span> ImportDataUI
UIControl</pre>
            <pre>
              <span class="lnum"> 46: </span> {</pre>
            <pre>
              <span class="lnum"> 47: </span> get</pre>
            <pre>
              <span class="lnum"> 48: </span> {</pre>
            <pre>
              <span class="lnum"> 49: </span>
              <span class="kwrd">if</span> (_xmlImportUI == <span class="kwrd">null</span>)</pre>
            <pre>
              <span class="lnum"> 50: </span> {</pre>
            <pre>
              <span class="lnum"> 51: </span> _xmlImportUI = <span class="kwrd">new</span> RSSDataAdapterUI();</pre>
            <pre>
              <span class="lnum"> 52: </span> _xmlImportUI.ID = <span class="str">"RssImport"</span>;</pre>
            <pre>
              <span class="lnum"> 53: </span> }</pre>
            <pre>
              <span class="lnum"> 54: </span>
              <span class="kwrd">return</span> _xmlImportUI;</pre>
            <pre>
              <span class="lnum"> 55: </span> }</pre>
            <pre>
              <span class="lnum"> 56: </span> }</pre>
            <pre>
              <span class="lnum"> 57: </span> }</pre>
          </div>
          <style type="text/css">


.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        </div>
        <p>
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  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.
</p>
        <p>
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.
</p>
        <h4>
        </h4>
        <h4>Using the RSS import adapter
</h4>
        <p>
When you start UmbImport you will see in step 2 that you can select the RssImport
data adapter
</p>
        <p>
          <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" />
        </p>
        <p>
In the next step we will see the form that we have created in the RSSDataAdapterUI
class. Here we can specify the RSS location.
</p>
        <p>
          <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" />
        </p>
        <p>
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.  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.
</p>
        <p>
          <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" />
        </p>
        <h4>The result
</h4>
        <p>
When you click next and next again on the confirm screen the RSS feed will be imported. 
</p>
        <p>
          <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" />  
</p>
        <p>
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  <a href="http://www.richardsoeteman.net/downloads/Umbraco/RSSDataAdapter.zip" target="_blank">download
the source here.</a></p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=88590237-db9a-4d5c-b718-c5986249d877" />
      </body>
      <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/2009/04/16/CreateACustomDataAdapterForUmbImportPart1.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://umbraco.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=18661" target="_blank"&gt;Umbraco
4.0.1&lt;/a&gt; and the packages &lt;a href="http://www.codeplex.com/blog4umbraco" target="_blank"&gt;Blog4Umbraco&lt;/a&gt; and &lt;a href="http://umbimport.soetemansoftware.nl/" 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/downloads/Umbraco/RSSDataAdapter.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</category>
      <category>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>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
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 <a href="http://www.nibble.be/?p=14" target="_blank">this
post from Tim</a> 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 
the dictionary items in the templates, usercontrols and xslt's  but we don't
want the pain of adding  the dictionary items in Umbraco manually. Now before
your read on I must warn you that the solution is not based on an architecture ;-)
</p>
        <h4>What happens if Umbraco can't find a dictionary item?
</h4>
        <p>
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.
</p>
        <p>
          <strong>Template</strong>
        </p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">umbraco:Item</span>
          <span class="attr">field</span>
          <span class="kwrd">="#Template_DetailHeader"</span>
          <span class="attr">runat</span>
          <span class="kwrd">="server"</span>
          <span class="kwrd">&gt;&lt;/</span>
          <span class="html">umbraco:Item</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>
          <strong>XSLT</strong>
        </p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">xsl:value-of</span>
          <span class="attr">select</span>
          <span class="kwrd">="umbraco.library:GetDictionaryItem('XSLT_FromDictionary')"</span>
          <span class="kwrd">/&gt;</span>
        </pre>
        <p>
          <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>
          <strong>Usercontrol Markup</strong>
        </p>
        <pre class="csharpcode">
          <span class="asp">&lt;%</span>=umbraco.library.GetDictionaryItem(<span class="str">"UserControl_Details"</span>) <span class="asp">%&gt;</span></pre>
        <p>
          <strong>Usercontrol Codebehind</strong>
        </p>
        <pre class="csharpcode">lb_name.Text = umbraco.library.GetDictionaryItem(<span class="str">"UserControl_LabelCaption"</span>); </pre>
        <p>
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. 
</p>
        <p>
          <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" />  
</p>
        <h3>
        </h3>
        <h4>How can we get that data?
</h4>
        <p>
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 <a href="http://www.15seconds.com/Issue/020910.htm" target="_blank">Trace
Listener</a>, 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  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.
</p>
        <div class="csharpcode">
          <pre>
            <span class="lnum"> 1: </span>
            <span class="kwrd">using</span> System;</pre>
          <pre>
            <span class="lnum"> 2: </span>
            <span class="kwrd">using</span> System.Diagnostics;</pre>
          <pre>
            <span class="lnum"> 3: </span>
            <span class="kwrd">using</span> System.Text.RegularExpressions;</pre>
          <pre>
            <span class="lnum"> 4: </span>
            <span class="kwrd">using</span> umbraco.BusinessLogic;</pre>
          <pre>
            <span class="lnum"> 5: </span>
            <span class="kwrd">using</span> umbraco.cms.businesslogic.language;</pre>
          <pre>
            <span class="lnum"> 6: </span> </pre>
          <pre>
            <span class="lnum"> 7: </span>
            <span class="kwrd">namespace</span> SoetemanSoftware.Tools</pre>
          <pre>
            <span class="lnum"> 8: </span>{</pre>
          <pre>
            <span class="lnum"> 9: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">class</span> AddUnknownDictionaryItemsListener
: TraceListener</pre>
          <pre>
            <span class="lnum"> 10: </span> {</pre>
          <pre>
            <span class="lnum"> 11: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">override</span>
            <span class="kwrd">void</span> Fail(<span class="kwrd">string</span> message)</pre>
          <pre>
            <span class="lnum"> 12: </span> {</pre>
          <pre>
            <span class="lnum"> 13: </span> AddItemWhenUnknown(message);</pre>
          <pre>
            <span class="lnum"> 14: </span> }</pre>
          <pre>
            <span class="lnum"> 15: </span> </pre>
          <pre>
            <span class="lnum"> 16: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">override</span>
            <span class="kwrd">void</span> Fail(<span class="kwrd">string</span> message, <span class="kwrd">string</span> detailMessage)</pre>
          <pre>
            <span class="lnum"> 17: </span> {</pre>
          <pre>
            <span class="lnum"> 18: </span> AddItemWhenUnknown(message);</pre>
          <pre>
            <span class="lnum"> 19: </span> }</pre>
          <pre>
            <span class="lnum"> 20: </span> </pre>
          <pre>
            <span class="lnum"> 21: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">override</span>
            <span class="kwrd">void</span> Write(<span class="kwrd">string</span> message)</pre>
          <pre>
            <span class="lnum"> 22: </span> {</pre>
          <pre>
            <span class="lnum"> 23: </span> AddItemWhenUnknown(message);</pre>
          <pre>
            <span class="lnum"> 24: </span> }</pre>
          <pre>
            <span class="lnum"> 25: </span> </pre>
          <pre>
            <span class="lnum"> 26: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">override</span>
            <span class="kwrd">void</span> WriteLine(<span class="kwrd">string</span> message)</pre>
          <pre>
            <span class="lnum"> 27: </span> {</pre>
          <pre>
            <span class="lnum"> 28: </span> AddItemWhenUnknown(message);</pre>
          <pre>
            <span class="lnum"> 29: </span> }</pre>
          <pre>
            <span class="lnum"> 30: </span>
            <span class="kwrd">public</span>
            <span class="kwrd">override</span>
            <span class="kwrd">void</span> WriteLine(<span class="kwrd">string</span> message, <span class="kwrd">string</span> category)</pre>
          <pre>
            <span class="lnum"> 31: </span> {</pre>
          <pre>
            <span class="lnum"> 32: </span> AddItemWhenUnknown(message);</pre>
          <pre>
            <span class="lnum"> 33: </span> }</pre>
          <pre>
            <span class="lnum"> 34: </span> </pre>
          <pre>
            <span class="lnum"> 35: </span>
            <span class="rem">/// &lt;summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 36: </span>
            <span class="rem">/// Parse at the message </span>
          </pre>
          <pre>
            <span class="lnum"> 37: </span>
            <span class="rem">/// &lt;/summary&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 38: </span>
            <span class="rem">/// &lt;param name="message"&gt;&lt;/param&gt;</span>
          </pre>
          <pre>
            <span class="lnum"> 39: </span>
            <span class="kwrd">private</span>
            <span class="kwrd">void</span> AddItemWhenUnknown(<span class="kwrd">string</span> message)</pre>
          <pre>
            <span class="lnum"> 40: </span> {</pre>
          <pre>
            <span class="lnum"> 41: </span>
            <span class="kwrd">try</span>
          </pre>
          <pre>
            <span class="lnum"> 42: </span> {</pre>
          <pre>
            <span class="lnum"> 43: </span> Match match = Regex.Match(message, <span class="str">"(Error
returning dictionary item ')(.*)(' --)"</span>, RegexOptions.Multiline);</pre>
          <pre>
            <span class="lnum"> 44: </span>
            <span class="kwrd">if</span> (match.Groups.Count
&gt; 1)</pre>
          <pre>
            <span class="lnum"> 45: </span> {</pre>
          <pre>
            <span class="lnum"> 46: </span>
            <span class="rem">//Get key from the mach collection</span>
          </pre>
          <pre>
            <span class="lnum"> 47: </span>
            <span class="kwrd">string</span> key = match.Groups[2].Value;</pre>
          <pre>
            <span class="lnum"> 48: </span>
            <span class="rem">//Check if key is allready
in Umbraco</span>
          </pre>
          <pre>
            <span class="lnum"> 49: </span>
            <span class="kwrd">if</span> (!umbraco.cms.businesslogic.Dictionary.DictionaryItem.hasKey(key))</pre>
          <pre>
            <span class="lnum"> 50: </span> {</pre>
          <pre>
            <span class="lnum"> 51: </span>
            <span class="rem">//Add new key with default
value to Umbraco</span>
          </pre>
          <pre>
            <span class="lnum"> 52: </span>
            <span class="kwrd">int</span> dictionaryID =
umbraco.cms.businesslogic.Dictionary.DictionaryItem.addKey(key, <span class="kwrd">string</span>.Format(<span class="str">"[{0}]"</span>,
key));</pre>
          <pre>
            <span class="lnum"> 53: </span> </pre>
          <pre>
            <span class="lnum"> 54: </span> var dictionaryItem = <span class="kwrd">new</span> umbraco.cms.businesslogic.Dictionary.DictionaryItem(dictionaryID);</pre>
          <pre>
            <span class="lnum"> 55: </span>
            <span class="kwrd">foreach</span> (Language l <span class="kwrd">in</span> Language.getAll)</pre>
          <pre>
            <span class="lnum"> 56: </span> {</pre>
          <pre>
            <span class="lnum"> 57: </span> dictionaryItem.setValue(l.id, <span class="kwrd">string</span>.Format(<span class="str">"[{0}]"</span>,
key));</pre>
          <pre>
            <span class="lnum"> 58: </span> }</pre>
          <pre>
            <span class="lnum"> 59: </span> dictionaryItem.Save();</pre>
          <pre>
            <span class="lnum"> 60: </span> }</pre>
          <pre>
            <span class="lnum"> 61: </span> }</pre>
          <pre>
            <span class="lnum"> 62: </span> }</pre>
          <pre>
            <span class="lnum"> 63: </span>
            <span class="kwrd">catch</span> (Exception ex)</pre>
          <pre>
            <span class="lnum"> 64: </span> {</pre>
          <pre>
            <span class="lnum"> 65: </span>
            <span class="rem">//Logic may never break on
this Listener</span>
          </pre>
          <pre>
            <span class="lnum"> 66: </span> Log.Add(LogTypes.Error, -1, <span class="kwrd">string</span>.Format(<span class="str">"Error
in Dictionary listener when adding item to dictionary {0} "</span>, ex.Message));</pre>
          <pre>
            <span class="lnum"> 67: </span> }</pre>
          <pre>
            <span class="lnum"> 68: </span> }</pre>
          <pre>
            <span class="lnum"> 69: </span> }</pre>
          <pre>
            <span class="lnum"> 70: </span>}</pre>
        </div>
        <style type="text/css">




.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
        <h4>Configure the TraceListener
</h4>
        <p>
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.
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">system.diagnostics</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">trace</span>
          <span class="attr">autoflush</span>
          <span class="kwrd">="true"</span>
          <span class="attr">indentsize</span>
          <span class="kwrd">="4"</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">listeners</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">remove</span>
          <span class="attr">name</span>
          <span class="kwrd">="Default"</span>
          <span class="kwrd">/&gt;</span>
          <span class="kwrd">&lt;</span>
          <span class="html">add</span>
          <span class="attr">name</span>
          <span class="kwrd">="AddDictionaryListener"</span>
          <span class="attr">type</span>
          <span class="kwrd">="SoetemanSoftware.Tools.AddUnknownDictionaryItemsListener,AddUnknownDictionaryItemsListener"</span>
          <span class="kwrd">/&gt;</span>
          <span class="kwrd">&lt;/</span>
          <span class="html">listeners</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;/</span>
          <span class="html">trace</span>
          <span class="kwrd">&gt;</span>
          <span class="kwrd">&lt;/</span>
          <span class="html">system.diagnostics</span>
          <span class="kwrd">&gt;</span>
        </pre>
        <p>
Also modify the existing Trace element by adding the <strong>writeToDiagnosticsTrace="true"</strong>.
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.
</p>
        <pre class="csharpcode">
          <span class="kwrd">&lt;</span>
          <span class="html">trace</span>
          <span class="attr">enabled</span>
          <span class="kwrd">="true"</span>
          <span class="attr">requestLimit</span>
          <span class="kwrd">="10"</span>
          <span class="attr">pageOutput</span>
          <span class="kwrd">="false"</span>
          <span class="attr">traceMode</span>
          <span class="kwrd">="SortByTime"</span>
          <span class="attr">localOnly</span>
          <span class="kwrd">="true"</span>
          <span class="attr">writeToDiagnosticsTrace</span>
          <span class="kwrd">="true"</span>
          <span class="kwrd">/&gt;</span> </pre>
        <h4>View the output
</h4>
        <p>
When you configured the trace listener and hit the page again the missing dictionary
items are added to Umbraco.
</p>
        <p>
          <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" />
        </p>
        <p>
Refresh the page again and you will see the following output
</p>
        <p>
          <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" />
        </p>
        <p>
Sometimes you will encounter caching issues. When you want to avoid that use the umbdebugshowtrace=true
querystring parameter which will prevent caching.
</p>
        <h3>
        </h3>
        <h4>Download
</h4>
        <p>
You can download the <a href="http://www.richardsoeteman.net/downloads/umbraco/AddUnknownDictionaryItemsListener.zip" target="_blank">DLL
here</a>. You can also dowload the <a href="http://www.richardsoeteman.net/downloads/umbraco/AddUnknownDictionaryItemsListener_source.zip" target="_blank">source
here</a>.
</p>
        <img width="0" height="0" src="http://www.richardsoeteman.net/aggbug.ashx?id=3d85a1f8-9d7d-4dea-a592-8b6d84eac613" />
      </body>
      <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/2009/04/01/AutoAddDictionaryItemsAnotherApproach.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.nibble.be/?p=14" 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;/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.15seconds.com/Issue/020910.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/downloads/umbraco/AddUnknownDictionaryItemsListener.zip" target="_blank"&gt;DLL
here&lt;/a&gt;. You can also dowload the &lt;a href="http://www.richardsoeteman.net/downloads/umbraco/AddUnknownDictionaryItemsListener_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>
  </channel>
</rss>