﻿<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Development/Virtualization</title>
    <description>Some cool tricks and tips (maybe some code) that I've picked up in my chosen profession</description>
    <link>http://www.scottallender.com/Blog/tabid/72/BlogId/3/Default.aspx</link>
    <language>en-US</language>
    <managingEditor>scott@n3bu1a.com</managingEditor>
    <webMaster>srallender@gmail.com</webMaster>
    <pubDate>Wed, 10 Mar 2010 08:29:23 GMT</pubDate>
    <lastBuildDate>Wed, 10 Mar 2010 08:29:23 GMT</lastBuildDate>
    <docs>http://backend.userland.com/rss</docs>
    <generator>Blog RSS Generator Version 3.5.1.19887</generator>
    <item>
      <title>C4C Recap</title>
      <description>&lt;p&gt; I've been meaning to write this post since Sunday evening, but things just kept getting in my way. This past weekend (10/16 – 10/18) I had the privilege to volunteer at &lt;a target="_blank" href="http://www.c4c-stl.org"&gt;Coders for Charities (C4C)&lt;/a&gt;. Like I said in a previous post, I viewed this as an opportunity to use some skills and experience that I have built up over time to a community that has given me loads in return.&lt;/p&gt;
&lt;p&gt;C4C (at least the way it was set up this year) was a 72 hour event where the geeks of St. Louis got together and cranked out some code for much deserving charities. This year, the majority of the participating charities needed website work. As a matter of fact, the majority of the site work was done using either &lt;a target="_blank" href="http://www.sitefinity.com/"&gt;SiteFinity&lt;/a&gt; and &lt;a target="_blank" href="http://www.dotnetnuke.com"&gt;DotNetNuke&lt;/a&gt;.&lt;/p&gt;&lt;a href=http://www.scottallender.com/Blog/tabid/72/EntryId/58/C4C-Recap.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://www.scottallender.com/Blog/tabid/72/EntryId/58/C4C-Recap.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/Blog/tabid/72/EntryId/58/C4C-Recap.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/Blog/tabid/72/EntryId/58/C4C-Recap.aspx</guid>
      <pubDate>Sat, 24 Oct 2009 12:41:00 GMT</pubDate>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=58</trackback:ping>
    </item>
    <item>
      <title>Getting the Browser to Recognize RSS Feeds</title>
      <description>&lt;p&gt;So very recently, I redesigned my site, which I now like, but will probably change it again in two months (it's my site thank you very much).  When I redesigned my site, I left off the syndication button, which was the primary way to subscribe to my blog.  This caused someone to reach out to me because they could not subscribe.&lt;/p&gt;
&lt;p&gt;My site is powered by DotNetNuke, and I love this application/platform.  It's flexible, (depending on what's installed) it's light, and it's easy to use (once you get used to a few things).  One of the very few things that has irked me about DotNetNuke though, is if you syndicate a module (like a blog) the browser doesn't pick up on it.  The majority of all the browsers now support Live Bookmarks, and the little RSS icon is one of the first things I look for when I come across a new feed.&lt;/p&gt;&lt;a href=http://www.scottallender.com/Blog/tabid/72/EntryId/57/Getting-the-Browser-to-Recognize-RSS-Feeds.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://www.scottallender.com/Blog/tabid/72/EntryId/57/Getting-the-Browser-to-Recognize-RSS-Feeds.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/Blog/tabid/72/EntryId/57/Getting-the-Browser-to-Recognize-RSS-Feeds.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/Blog/tabid/72/EntryId/57/Getting-the-Browser-to-Recognize-RSS-Feeds.aspx</guid>
      <pubDate>Tue, 13 Oct 2009 02:49:00 GMT</pubDate>
      <slash:comments>4</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=57</trackback:ping>
    </item>
    <item>
      <title>St. Louis Day of .Net</title>
      <description>&lt;p&gt;A quick hit of my DotNetNuke presentation at St. Louis's Day of .Net.&lt;/p&gt;&lt;a href=http://www.scottallender.com/Blog/tabid/72/EntryId/53/St-Louis-Day-of-Net.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://www.scottallender.com/Blog/tabid/72/EntryId/53/St-Louis-Day-of-Net.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/Blog/tabid/72/EntryId/53/St-Louis-Day-of-Net.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/Blog/tabid/72/EntryId/53/St-Louis-Day-of-Net.aspx</guid>
      <pubDate>Wed, 02 Sep 2009 05:41:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=53</trackback:ping>
    </item>
    <item>
      <title>Overriding the Base Skin Object in DotNetNuke</title>
      <description>&lt;p&gt;Today, I was presented with an interesting problem.  How can you use the same content for two different website, but account for some very minor changes in your DotNetNuke skin?  After thinking about it for a little bit, I decided to override the base Skin class.  Turns out, with an RESX or XML file, this is a pretty darn elegant solution.
&lt;/p&gt;&lt;p&gt;First, let's take a look at the code.  In order to do this properly, the class being created needs to inherit from &lt;span style="font-size:10pt"&gt;&lt;span style="font-family:Courier New"&gt;DotNetNuke&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;UI&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;Skins.Skin.&lt;/span&gt;  T&lt;/span&gt;his enables the class to pick up all of the appropriately used public properties and methods and provides the ability to add overridden/custom properties.  In my particular case, the driving force behind the customization in the skin development was the URL name.  I probably could use any PortalSetting (name, ID, etc), but I chose to go with the URL.  It's easy enough to get.  Here's what my code started off looking like:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;class&lt;/span&gt;
			&lt;span style="color:olive"&gt;MySkinDefault &lt;/span&gt;: DotNetNuke.UI.Skins.&lt;span style="color:olive"&gt;Skin&lt;br/&gt;&lt;/span&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    &lt;span style="color:blue"&gt;public&lt;/span&gt; MySkinDefault()
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;At this point, the code is doing nothing.  Loading a skin that inherits from this class will load exactly like the regular skin object.  That's no fun.  In the skin I was working with, I added three ASP.Net controls, a Label and two Literal controls.  To make sure that my custom Skin class could reference them, I added three new lines of code.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;class&lt;/span&gt;
			&lt;span style="color:olive"&gt;MySkinDefault&lt;/span&gt; : DotNetNuke.UI.Skins.&lt;span style="color:olive"&gt;Skin&lt;br/&gt;&lt;/span&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;protected&lt;/span&gt; System&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;Web&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;UI&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;WebControls&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:olive"&gt;Label&lt;/span&gt; lbl;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;protected&lt;/span&gt; System&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;Web&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;UI&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;WebControls&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:olive"&gt;Literal&lt;/span&gt; ltcTop;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;protected&lt;/span&gt; System&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;Web&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;UI&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;WebControls&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:olive"&gt;Literal&lt;/span&gt; ltcBottom;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    &lt;span style="color:blue"&gt;public&lt;/span&gt; MySkinDefault()
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;The new items are scoped as protected so that they can interact with the ASCX file.  This is important because if they are marked private, the code-behind file that gets generated by the .Net framework wil not be able to access the controls.  For more info, check this link out: &lt;a href="http://msdn.microsoft.com/en-us/library/015103yb(vs.71).aspx"&gt;http://msdn.microsoft.com/en-us/library/015103yb(vs.71).aspx&lt;/a&gt;.  It's a bit dated, but it helps explain. 
&lt;/p&gt;&lt;p&gt;Now that I have controls on my skin that I can reference, I need to be able to dynamically fill them.  For that, I need to override the base class's &lt;span style="font-family:Courier New; font-size:10pt"&gt;OnLoad&lt;/span&gt; event.
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;protected override void&lt;/span&gt; OnLoad( &lt;span style="color:blue"&gt;EventArgs&lt;/span&gt; e )
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; (!IsPostBack)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    {
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; (Context.Request.Url.Host == www.myexample.com)
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        {
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 108pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;lbl.Text = "I am at myexample.com!";
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 108pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;ltcTop.Text = "&lt;a href=http://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.com\"http://www.somewhereelse.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.com\"&gt;Some where else!&lt;/a&gt;";
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        &lt;span style="color:blue"&gt;else
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        {
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 108pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;lbl.Text = "I am not at myexample.com!";
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 108pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;ltcTop.Text = "&lt;a href=http://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.com\"http://www.myexample.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.com\"&gt;myexample.com&lt;/a&gt;";
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        ltcBottom.Text = ltcTop.Text;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    &lt;span style="color:blue"&gt;base&lt;/span&gt;.OnLoad( e );
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Two things to note:
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The override keyword let's me override the base implementation of the OnLoad event.  Since it's overriding the event, I don't need to pass it a sender (that's already done for me in the initial declaration).
&lt;/li&gt;&lt;li&gt;I &lt;strong&gt;want&lt;/strong&gt; DotNetNuke's base Skin object to pick up where my method completes, so I call my base class's OnLoad event, passing the e argument from my class.  The reason I want DNN to finish it's work is because the Page_Load event does a bunch of more stuff, and I don't want it to code it in my implmentation.
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;My finished class looks like this:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;public&lt;/span&gt;
			&lt;span style="color:blue"&gt;class&lt;/span&gt;
			&lt;span style="color:olive"&gt;MySkinDefault&lt;/span&gt; : DotNetNuke.UI.Skins.&lt;span style="color:olive"&gt;Skin&lt;br/&gt;&lt;/span&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;protected&lt;/span&gt; System&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;Web&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;UI&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;WebControls&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:olive"&gt;Label&lt;/span&gt; lbl;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;protected&lt;/span&gt; System&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;Web&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;UI&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;WebControls&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:olive"&gt;Literal&lt;/span&gt; ltcTop;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;protected&lt;/span&gt; System&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;Web&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;UI&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;WebControls&lt;span style="color:maroon"&gt;&lt;strong&gt;.&lt;/strong&gt;&lt;/span&gt;&lt;span style="color:olive"&gt;Literal&lt;/span&gt; ltcBottom;
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    &lt;span style="color:blue"&gt;public&lt;/span&gt; MySkinDefault()
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;protected override void&lt;/span&gt; OnLoad( &lt;span style="color:blue"&gt;EventArgs&lt;/span&gt; e )
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;{
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    &lt;span style="color:blue"&gt;if&lt;/span&gt; (!IsPostBack)
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    {
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        &lt;span style="color:blue"&gt;if&lt;/span&gt; (Context.Request.Url.Host == www.myexample.com)
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        {
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 144pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;lbl.Text = "I am at myexample.com!";
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 144pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;ltcTop.Text = "&lt;a href=http://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.com\"http://www.somewhereelse.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.com\"&gt;Some where else!&lt;/a&gt;";
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        &lt;span style="color:blue"&gt;else
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        {
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 144pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;lbl.Text = "I am not at myexample.com!";
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 144pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;ltcTop.Text = "&lt;a href=http://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.com\"http://www.myexample.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.comhttp://www.scottallender.com\"&gt;myexample.com&lt;/a&gt;";
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        }
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;        ltcBottom.Text = ltcTop.Text;
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    }
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;    &lt;span style="color:blue"&gt;base&lt;/span&gt;.OnLoad( e );
&lt;/span&gt;&lt;/p&gt;&lt;p style="margin-left: 36pt"&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;}
&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;Pretty simple stuff.   Now comes the fun part of making sure that my Skin uses this class.  To do that, I need to make certain of two things:
&lt;/p&gt;&lt;ol&gt;&lt;li&gt;In the Page Declaration section, I need to inherit from this class, &lt;strong&gt;not&lt;/strong&gt; the DotNetNuke Skin class.
&lt;/li&gt;&lt;li&gt;That my Label and my Literal controls are present on the skin.  Since I'm not checking to see if those to control instances are null, they must be there.  Otherwise I get a &lt;span style="font-family:Courier New"&gt;NullException&lt;/span&gt;.
&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here's what my skin object would look like:
&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="background-color:yellow"&gt;&lt;%&lt;/span&gt;&lt;span style="color:blue"&gt;@&lt;/span&gt;
			&lt;span style="color:#a31515"&gt;Control&lt;/span&gt;
			&lt;span style="color:red"&gt;Language&lt;/span&gt;&lt;span style="color:blue"&gt;="vb"&lt;/span&gt;
			&lt;span style="color:red"&gt;AutoEventWireup&lt;/span&gt;&lt;span style="color:blue"&gt;="false"&lt;/span&gt;
			&lt;span style="color:red"&gt;Explicit&lt;/span&gt;&lt;span style="color:blue"&gt;="True"&lt;/span&gt;
			&lt;span style="color:red"&gt;Inherits&lt;/span&gt;&lt;span style="color:blue"&gt;=" MySkinDefault"&lt;/span&gt;
			&lt;span style="background-color:yellow"&gt;%&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;table&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;tr&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;td&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp:Label &lt;/span&gt;&lt;span style="color:red"&gt;id&lt;/span&gt;&lt;span style="color:blue"&gt;="lbl"&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;span style="color:red"&gt;runat&lt;/span&gt;&lt;span style="color:blue"&gt;="server"&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;span style="color:blue"&gt;/&gt;&lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;td&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;td &lt;/span&gt;&lt;span style="color:red"&gt;style&lt;/span&gt;&lt;span style="color:blue"&gt;="text-align:right;"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp:Literal &lt;/span&gt;&lt;span style="color:red"&gt;ID&lt;/span&gt;&lt;span style="color:blue"&gt;="ltcTop"&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;span style="color:red"&gt;runat&lt;/span&gt;&lt;span style="color:blue"&gt;="server"&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;span style="color:blue"&gt;/&gt;&lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;td&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;tr&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;tr&gt;&lt;/span&gt;&lt;span style="color:red"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;td &lt;/span&gt;&lt;span style="color:red"&gt;colspan&lt;/span&gt;&lt;span style="color:blue"&gt;="2"&lt;/span&gt;&lt;span style="color:#a31515"&gt; ID&lt;/span&gt;&lt;span style="color:blue"&gt;="ContentPane"&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;span style="color:red"&gt;runat&lt;/span&gt;&lt;span style="color:blue"&gt;="server"&gt;&lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;td&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;tr&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;tr&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;        &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;td &lt;/span&gt;&lt;span style="color:red"&gt;colspan&lt;/span&gt;&lt;span style="color:#a31515"&gt;=&lt;/span&gt;&lt;span style="color:blue"&gt;"2"&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;span style="color:red"&gt;style&lt;/span&gt;&lt;span style="color:#a31515"&gt;=&lt;/span&gt;&lt;span style="color:blue"&gt;"text-align:right;"&gt;&lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;asp:Literal &lt;/span&gt;&lt;span style="color:red"&gt;ID&lt;/span&gt;&lt;span style="color:blue"&gt;="ltcBottom"&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;span style="color:red"&gt;runat&lt;/span&gt;&lt;span style="color:blue"&gt;="server" /&gt;&lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;td&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:#a31515"&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;&lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;tr&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New; font-size:10pt"&gt;&lt;span style="color:blue"&gt;&lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;table&lt;/span&gt;&lt;span style="color:blue"&gt;&gt;&lt;/span&gt;&lt;span style="background-color:yellow"&gt;
			&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;
 &lt;/p&gt;&lt;p&gt;And there you have it!  An overridden skin that you can customize even further than the what the out of the box DotNetNuke install provides.&lt;/p&gt;</description>
      <link>http://www.scottallender.com/blog/tabid/72/EntryId/49/Overriding-the-Base-Skin-Object-in-DotNetNuke.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/blog/tabid/72/EntryId/49/Overriding-the-Base-Skin-Object-in-DotNetNuke.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/blog/tabid/72/EntryId/49/Overriding-the-Base-Skin-Object-in-DotNetNuke.aspx</guid>
      <pubDate>Thu, 07 May 2009 22:35:49 GMT</pubDate>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=49</trackback:ping>
    </item>
    <item>
      <title>Troubleshooting DNN Upgrade Issue on Windows Server 2008 or IIS7</title>
      <description>&lt;p&gt; &lt;/p&gt;&lt;a href=http://www.scottallender.com/Blog/tabid/72/EntryId/48/Troubleshooting-DNN-Upgrade-Issue-on-Windows-Server-2008-or-IIS7.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://www.scottallender.com/Blog/tabid/72/EntryId/48/Troubleshooting-DNN-Upgrade-Issue-on-Windows-Server-2008-or-IIS7.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/Blog/tabid/72/EntryId/48/Troubleshooting-DNN-Upgrade-Issue-on-Windows-Server-2008-or-IIS7.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/Blog/tabid/72/EntryId/48/Troubleshooting-DNN-Upgrade-Issue-on-Windows-Server-2008-or-IIS7.aspx</guid>
      <pubDate>Wed, 06 May 2009 04:51:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=48</trackback:ping>
    </item>
    <item>
      <title>DotNetNuke Scheduler Tips &amp; Tricks</title>
      <description>&lt;p&gt;So lately, I've been clowning around with DotNetNuke's scheduler engine.  I'm in the process of creating a Twitter module for DNN for my day job.  Apparently, the day job's website and intranet are pounding the "hell" out of the Twitter API, causing none of the updates to show after a specific amount of API requests are passed (probably between 65 - 100).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;How do I resolve the issue?  Well, I decided to cache the requests in a database that I control via the RSS feeds that twitter provides.  Doing that, and creating the corresponding user interface, enables me to "pound" my database as opposed to the Twitter API, which then ensures that content is always being displayed.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;That's all great, but it stinks if I have to manually update the cache myself, which is where the DNN Scheduler comes into play.  I created a scheduled task (I will do my best to post a blog later about it), and my life should have been hunky dory.  Unfortunately, if you don't set up the scheduled task using the exact class name and assembly name (&lt;Fully Qualified Class Name&gt;,&lt;Everything Before Prior to .DLL extension is the Assembly Name&gt;), then you scheduled task sits there like a bump on a log.  Actually, it's worst than a bump on a log because the scheduler exception won't trap a mistyped assembly.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Long story short, when creating a scheduled task in DotNetNuke, be SURE that you know both the FULLY QUALIFIED class that will execute and the Assembly Name.  Otherwise your scheduled task won't execute.&lt;/p&gt;</description>
      <link>http://www.scottallender.com/home/tabid/36/EntryId/46/DotNetNuke-Scheduler-Tips-Tricks.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/home/tabid/36/EntryId/46/DotNetNuke-Scheduler-Tips-Tricks.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/home/tabid/36/EntryId/46/DotNetNuke-Scheduler-Tips-Tricks.aspx</guid>
      <pubDate>Fri, 03 Apr 2009 04:27:00 GMT</pubDate>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=46</trackback:ping>
    </item>
    <item>
      <title>Getting Keyboard Keys To Work Correctly on Linux Hosts Running VMware Workstation</title>
      <description>&lt;p&gt;Helping to resolve mismatched keystrokes (backspace not working, arrow keys don't work appropriately, etc) in vm guests hosted by Linux VMware Workstation 6.5.1 hosts.&lt;/p&gt;&lt;a href=http://www.scottallender.com/Blog/tabid/72/EntryId/45/Getting-Keyboard-Keys-To-Work-Correctly-on-Linux-Hosts-Running-VMware-Workstation.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://www.scottallender.com/Blog/tabid/72/EntryId/45/Getting-Keyboard-Keys-To-Work-Correctly-on-Linux-Hosts-Running-VMware-Workstation.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/Blog/tabid/72/EntryId/45/Getting-Keyboard-Keys-To-Work-Correctly-on-Linux-Hosts-Running-VMware-Workstation.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/Blog/tabid/72/EntryId/45/Getting-Keyboard-Keys-To-Work-Correctly-on-Linux-Hosts-Running-VMware-Workstation.aspx</guid>
      <pubDate>Thu, 19 Feb 2009 01:25:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=45</trackback:ping>
    </item>
    <item>
      <title>Auto Pass Through with Active Directory Provider in DotNetNuke</title>
      <description>&lt;p&gt; &lt;/p&gt;&lt;a href=http://www.scottallender.com/Blog/tabid/72/EntryId/44/Auto-Pass-Through-with-Active-Directory-Provider-in-DotNetNuke.aspx&gt;More...&lt;/a&gt;</description>
      <link>http://www.scottallender.com/Blog/tabid/72/EntryId/44/Auto-Pass-Through-with-Active-Directory-Provider-in-DotNetNuke.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/Blog/tabid/72/EntryId/44/Auto-Pass-Through-with-Active-Directory-Provider-in-DotNetNuke.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/Blog/tabid/72/EntryId/44/Auto-Pass-Through-with-Active-Directory-Provider-in-DotNetNuke.aspx</guid>
      <pubDate>Mon, 16 Feb 2009 19:07:00 GMT</pubDate>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=44</trackback:ping>
    </item>
    <item>
      <title>DotNetNuke Module Settings Header/Footer</title>
      <description>&lt;p&gt;So I was bouncing around on a project I'm working on for my "day job," and I noticed a tremendous number of Text/HTML modules being used as a summarization for the function of the page.  Using the Text/HTML module in that function is fine, but it's not taking advantage of linking to other pages on the site or token replacement, it's kind of a waste.&lt;/p&gt;
&lt;p&gt;How do you get around that though?  Well, every module in DNN has an advanced setting where  you can specify header or footer text.  In the case outlined above, this works perfectly.  One of the benefits of using this is with less modules on the page, page loads become a little more efficient.&lt;/p&gt;</description>
      <link>http://www.scottallender.com/home/tabid/36/EntryId/43/DotNetNuke-Module-Settings-Header-Footer.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/home/tabid/36/EntryId/43/DotNetNuke-Module-Settings-Header-Footer.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/home/tabid/36/EntryId/43/DotNetNuke-Module-Settings-Header-Footer.aspx</guid>
      <pubDate>Fri, 15 Aug 2008 05:22:00 GMT</pubDate>
      <slash:comments>2</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=43</trackback:ping>
    </item>
    <item>
      <title>Expand a VMware VM System Disk</title>
      <description>&lt;p&gt;For work, I recently had to expand a system disk for a VMware VM.  Of course, the conventional wisdom is that you cannot expand the system disk.  But did I let something like common sense stop me?  No!&lt;/p&gt;
&lt;p&gt;Basically, I converted the VM.  The VMware converter allows you to P2V (physical to virtual) and V2V (virtual to virtual) computer systems (mostly servers).  But, one option allows you to convert one machine between ESX hosts.  During the conversion process, you can state how large you want the disk to be.  Once at that point, you can expand the size of the disk.  Afterwards you can run the vm with the completely expanded disk.  I'll post a more detailed walkthrough later.&lt;/p&gt;</description>
      <link>http://www.scottallender.com/home/tabid/36/EntryId/37/Expand-a-VMware-VM-System-Disk.aspx</link>
      <author>scott@n3bu1a.com</author>
      <comments>http://www.scottallender.com/home/tabid/36/EntryId/37/Expand-a-VMware-VM-System-Disk.aspx#Comments</comments>
      <guid isPermaLink="true">http://www.scottallender.com/home/tabid/36/EntryId/37/Expand-a-VMware-VM-System-Disk.aspx</guid>
      <pubDate>Sat, 26 Apr 2008 01:50:00 GMT</pubDate>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.scottallender.com/DesktopModules/Blog/Trackback.aspx?id=37</trackback:ping>
    </item>
  </channel>
</rss>