August BADNUG Meeting Postponed

Turns out, it’s a crappy night for a lot of people.  I’ve heard from several people who would like to attend but can’t due to school orientation, classes, etc.

So, the Augist BADNUG meeting is postponed.  We’ll make it up to you, we promise.

Review: Building Websites with VB.NET and DotNetNuke 3.0

I’ve had the priviledge of reading Dan Egan’s Building Websites with VB.NET and DotNetNuke 3.0 recently, and there are other reviews out there, I figured I’d chime in also.

Overall, I think this is a better book for the DNN beginner than the WROX book (see, and is more suitable to the non-technical people who may be administrating the portal, but not developing for it.  It’s not perfect, but I think these users will appreciate some of the extra work Dan put into this book.  Most of the book is written as if you are building a coffehouse locator together, so much of the book flows from one topic into another, and is written with a point.

Chapter 1 starts you with an overview of portals in general, and explains why DNN is a very good choice.  Dan also lays the groundwork for the portal you’ll be building (Coffe Connections), and demonstrates a technique called “user stories” than can help design an effective portal.

Chapter 2 covers installation on a local machine, which I think many users may not need to worry about.  It’s not something everyone needs to know, but it’s a good idea to familiarize oneself with the information even if you won’t be performing the installation.

Chapter 3 really gets into the meat of DotNetNuke.  It’s probably the best coverage of users, roles and pages and how they operate in DotNetNuke I’ve seen.  There is a chunk of very technical information regarding the Membership Provider; if you’re not developing for DNN, you can safely ignore this section and not miss anything.  Useful information for all in this chapter includes how to control user registration, how to create pages and control access to them using user roles.  This chapter is written using the user stories created in chapter 1.

Chapter 4 is great.  This chapter covers all the standard modules included with DotNetNuke, with a simple explanation.  Coffee Connections isn’t tied into this chapter too tightly, but it fits.  Dan went above the usual descriptions of the modules, and includes some “Practical Purposes” of each module, and how to administrate the modules.  This is a very useful chapter for anyone who will be working with DNN.

Chapter 5 covers the host and admin tools.  This seems a little out of order, but contains great information on how to administer your portal.  It covers the difference between ‘host’ and ‘admin’ logins, how to change site settings, upload new images to be used on the site, view logs and a few other features.

Chapters 6 and 7 get way off course in the context of building Coffee Connections.  They contain some very detailed technical information, more suitable for the developer than administrator.  The non-technical administrator can skip over these chapters and not miss too much.  For the developer, chapter 6 covers caching, config files, providers and other detailed information you’ll need to develop custom modules.  Chapter 7 is an introduction into building custom modules (called “Private Assemblies”) in DNN.  Included are discussions of setup and adding the proper user controls (you need at least 3 ASCX files–a View, an Edit, and a Settings), packaging your module and adding it to a site, and creating a business logic layer and a data access layer using the database provider module.  Extensive code examples in VB.NET are provided.  The sample module you’re building is a custom Coffee Shop Listing control for Coffee Connections.  This chapter alone is nearly 1/5 of the book’s almost 300 pages, and is very detailed.

Chapter 8 covers creating DNN skins and containers, and how to apply them to your site.  You create Coffee Connections’ skin using Visual Studio, and ending up with an HTML and token based skin.  This is a short chapter, and doesn’t go too deep into skinning (but compared to custom modules, skinning isn’t a deep subject anyway), but you’ll be able to create DNN skins after reading this chapter.

Chapter 9 lists some must-have modules, where to find them and how to use them.  Another great chapter, and I now use several modules I didn’t know about until I read this chapter.

Chapter 10 covers deploying your portal to a live site, using FTP and SQL Server Enterprise Manager.  Presumably, many readers will already have passed this point, but it’s good for the beginner ready to go live.

Chapter 11 covers one of DNN’s best features–supporting multiple portals from a single installation.  This is exceptionally useful for a school or other setup where one parent portal may be the gateway to the portals of other departments, etc.

Chapter 12 covers the Provider Model as its implemented in DNN.  If you’re new to the provider model, DNN is a very complicated example to try and learn from.  Chapter 12 will bring you up to speed with the theory of the provider model so you’ll be able to work with DNN’s implementation effectively.

Overall, I think this book is better for the non-technical user than WROX’s book, but adds technical information in a few spots that can distract such a user.  If you’re a hard core DNN developer, DNN’s book is probably the better technical manual (being written by the DNN Core Team, you’d expect that), but this book makes an excellent secondary reference.

Tweaking StoreFront 6 Page Layout

The design and layout of pages in StoreFront 6 can be somewhat controlled through their design and configuration tool.  When the page is rendered, the values you set in the configuration tool overwite the defaults set at design time, generating the final layout.

As it turns out, the physical layout of the pages is controlled by two tables.  One, named PageTable, is the outer table, and its defaults are not overwritten.  PageTable contains a single row, with a single cell, no borders, 100% width.  The inner table, PageSubTable, is the one whose settings are overwritten.  Maybe there’s a good reason for this, or maybe LaGarde didn’t read the “Good HTML” chapter in their books.  Whatever the reason, with some small tweaking, you can use PageTable to your advantage with more stylized layouts.

Rather than change the tag on every page, it would be nice to assign PageTable a CSS class, so we can control its appearance using stylesheets.  Rather than edit each and every page, we can use FrontPage’s “search all pages” feature for the string ‘id=”PageTable”‘, and edit the tage ourselves.  Unfortunately, not all the tags are the same, or we could just use the Replace feature as well.  There’s less than 50 instances you’ll need to edit, so it’s not so horrible. Bare minimum, the TABLE tag should have an id attribute and class attrribute.  After this, you can control its appearance through CSS.

If you want to tie PageTable’s appearance into the SF/FP configuration tool, you can skip the editing of each tag.  Instead, open CWebPage.vb, and find the sub named SetDesign (around line 289 in my version).  Several lines into this sub is the block of code which overwrites PageSubTable’s default values with the ones you set through the designer.  Make a copy of this block, ad change PageSubTable to PageTable.  This will apply the designer settings to PageTable.  You can comment out PageSubTable (you really shouldn’t apply the settings to both tables, the results could be a little unexpected), or change it to suit your needs.

StoreFront 6: The Annoying TopSubBanner, and How To Fix It

Don’t let anyone ever tell you LaGarde’s StoreFront produces clean HTML.  Far from it!  Most modern browsers will work around the duplicated attributes, missing tags and non-compliant HTML.  But, if your site is targeted to users who may be using assistive devices, you or your technical staff have a lot of cleanup work ahead of you.  Additionally, some of this non-compliant HTML affects your design in very annoying ways.

One problem StoreFront has is with the TopSubBanner.  To start with, it’s named TopBar in the configuration tool, but the files are named TopSubBanner, and the documentation refers to TopSubBanner.  Maybe they’ll invest in a proofreader for version 7.

The display of TopSubBanner is controlled by a checkbox in the configuration tool.  This checkbox determines whether or not the contents of TopSubBanner.ascx are displayed.  So far, so good, right?  So much you know.

The display of the control is actually handled by setting the visibility of the table cell.  The control is still loaded and processed (a waste of time and CPU cycles), but visibility is controlled at the HTML level.  You can see in this snippet below:

        <td class=”TopSubBanner” id=”TopSubBannerCell” width=”100%” colSpan=”3″>
         <!– Top Sub Banner Start –>
         <uc1:topsubbanner id=”TopSubBanner1″ runat=”server”></uc1:topsubbanner>
         <!– Top Sub Banner End –>

If you choose to display TopSubBanner (or TopBar), this is all well and good.  However, if you turn off the display, when your page is rendered, the final HTML is thus:


An empty pair of TR tags.  Not compliant at all!  The effect differs with the browser.  In some older browsers (and don’t think people aren’t still using them) this will throw your page layout way off.  IE will compensate by inserting the missing TD tags, leaving you with a blank row (1 px in height, unless you’ve added additional padding or spacing or such)–see below.

FireFox ignores the tags, which in this case is a better way to handle it.

There are a couple fixes, but unfortunately you will have to make these changes on every page.  One simple solution, if you won’t be using the TopSubBanner at all, is to turn off the visibility of the TR tags with a simple HTML modification:

       <tr runat=”server” visible=”false”>
        <td class=”TopSubBanner” id=”TopSubBannerCell” width=”100%” colSpan=”3″>
         <!– Top Sub Banner Start –>
         <uc1:topsubbanner id=”TopSubBanner1″ runat=”server”></uc1:topsubbanner>
         <!– Top Sub Banner End –>

This will prevent the blank TR tags from showing, and correct the IE rendering of the code.  Another fix that will allow toggling of the TopSubBanner with proper display is a little more involved.  This might be overkill on a single site, but for developers with the XE version, you might want to update the source files which are copied when a new store is created (be sure to keep backups).

First, give the TR tags an ID attribute:

   <tr id=”TopSubBannerRow”>

Then, open the file CWebPage.vb, and do a find for TopSubBannerCell.  The first entry (around line 327 in my version) is what sets the visibility of the table cell.  Inside the If…Then block, add the following code:

     dim TempRow as HtmlTableRow
     TempRow = CType(PageSubTable.FindControl(“TopSubBannerRow”), HtmlTableRow)
     TempRow.Visible = False
     TempRow = Nothing

Compile the code and load your page.  The page should display properly, and if the TopSubBanner is set to not display, you should not have an empty set of TR tags.  All you need to do from here is give every TR tag which contains the TopSubBannerCell the same ID (FrontPage’s Find command can be used to search all files for TopSubBannerCell, which makes ife easier).  When done, compile and you should be good to go.

I’m not sure who’s supposed to check this (if anyone), but this never should have left the farm.

StoreFront 6 Error: “Database does not exist”

If you’re setting up a new store through LaGarde’s wizard in FrontPage, and you get a “Database does not exist error”, check the user ID and password if you’re positive the database exists.  “Database does not exist” is a generic error message-StoreFront doesn’t tell you if your credentials are wrong, or if the server is stopped, etc.

August BADNUG Meeting – ExcelXmlWriter and Skinning DotNetNuke

This month’s presentation will be held at BC3’s Cranberry Campus, behind Costco in Cranberry Township, PA.  It’s easy to find, so if you’ve never been here before, map it from your location and see how convenient we are!

Tool of the Month (“use one, don’t be one”)

Would anyone be surprised if we made the claim that your workplace probably runs on caffeine and Microsoft Excel?  Probably the most common task developers have is taking information from a datasource and getting it into Excel workbooks.  Rich Dudley will demonstrate one of his favorite tools, Carlos Aguilar’s free ExcelXmlWriter.

We’ll also briefly review how to use the blog features on the BADNUG website.

Skinning DotNetNuke

One of the major features of the DotNetNuke portal is its skinning capabilities, yet this capability is poorly documented in both books and the included documentation.  Following on our previous “Intro to DNN” meeting, Rich Dudley will walk through creating a skin, and share some pitfalls he’s encountered in working with and


We have two copies of Daniel Egan’s “Building Websites with VB.NET and DotNetNuke 3.0”, and all the Visual Studio 2005/SQL Server 2005 Beta 2’s you want.

More information:

The Massiveness of Microsoft

I’m clearing out The Stack, and here are a couple of nuggets from the December 2004 Fast Company I’ve been meaning to blog about.  The article focuses on Innovation (and the perceived lack thereof) at Microsoft

  • Venture capitalists typically look at 50-100 deals to find a good $20 million investment.  Microsoft, with its $6.8 billion R&D budget, would have to cover some 35,000 ideas to keep on the same pace.

  • Google’s $1.5 billion in revenue would lift Microsoft’s top line by just 4%.

  • In the software industry, a research project is considered successful if it produces 10-15% annual revenue growth.  By this standard, Microsoft would have to create the third or fourth largest software company in the world each year to be considered innovative.

  • From its $37 billion in annual sales, Microsoft generates $9 billion in cash flow and $8 billion in profit; that’s twice as operationally efficient as GE and better than twice as profitable as IBM.

  • Microsoft spends $6.8 billion each year in R&D.  IBM spends $5 billion.  The annual R&D budgets of Oracle, HP, Dell, Apple and Sun combined are less than Microsoft’s.

That’s big.

Developing Locally with LaGarde’s StoreFront 6.x

I’ve used LaGarde’s StoreFront product for years, and currently have a number of websites running it.  Although it’s been out for a few years, I’ve started upgrading them this year from SF 5 to SF 6.  There were serious issues in the early versions that I wanted LaGarde to resolve before I subjected my customers to their bad coding (which is a topic for another post).

StoreFront’s manuals suck.  Really bad.  Information is spread out in on-line tutorials, the printed manual, and a downloadable CHM.  Some of this information contradicts the other sources.  Some information is totally missing.  Like anyone with a clue, I develop locally.  StoreFront 6 does allow you to do this, but it’s not documented well.

For my local database, I use SQL Server 2000 Developer Edition, which for all intents and purposes is SQL Server 2000 Standard Edition with a licensing restriction.  LaGarde’s connections use SQL Authentication, so if you’re used to having a trusted connection, get out of that habit.  This means you’ll need to create a SQL Server user that has DBO role for your StoreFront DB, and it doesn’t hurt to make its server role be system admin.  Use as the address for your server, and the user you just created for the user.  The database name you ought to know by this point.

In order to connect LaGarde’s client tool to your database, you need to make some IIS configuration changes.  Open the IIS management panel, and drill down to your SSL folder.  Right-click on the SSL folder, and open the Properties.  Go to the Directory Security tab, turn off Allow Anonymous, and enable both Basic and Windows Integrated.

You’ll also need a username and password for a user that can access this folder.  You can create users through the Control Panel.  The user only needs to be a Limited Account, but it does need a password.  In FrontPage, when you open the StoreFront configuration tool, you’ll be prompted for the URL of clientaccess.aspx (usually Posted on Categories StoreFront 6

Know When To Quit

Today’s NewsFactor Network showed up in my inbox, and the lead story was:


1. E-Mail Authentication: Holy Grail or Lost Cause?


Originally, e-mail was never designed to do anything more than deliver text messages. But added-on features eventually opened gaps that hackers quickly exploited.

See the Full Story:

I’m cool with the second sentence.  How many viruses propogate via e-mail in some form or another.  Not to mention web bugs tracking live addresses, etc.  This was followed by one of their “most popular articles”:


4. Novell Aims To Push E-Mail Further


Novell’s open source Hula Project will bring new applications to e- mail, predicted David Patrick, vice president of open source platforms at Novell.

See the Full Story:


So, Novell wants to add more features to something already rendered a little insecure by extending it?  Anyone else see a problem with that?  Which begs the question, “how long until something evil propogates via podcast”?  Let’s face it, there are all sorts of known holes in WMP.  RSS started out as a text-only information transmission system, and it’s been extended with enclosures to include images (couple trojans already hide in malformed JPGs) as well as MP3 or WMA.  I’m guessing it’s only a matter of time.

Windows XP SP2 Users Can’t Open Crystal Reports Exported To PDF or Excel

I have a web forms application based on Crystal Reports .NET 2003, and one of the options I present users is the choice between HTML output (using CrystalReportViewer), or export to PDF or XLS.  All the reports from this application open in a new window (see, which adds an additional problem with Win XP SP2.  Usually, setting the pop-up blocker to “always allow pop-ups from this site” fixes the problem, but not in this recent case. 

In this recent case, the popup window opened normally, and HTML output worked fine.  For PDf and XLS output, the popup would open and close in an instant, with no prompt to download the file.  We eventually figured out that prompting for file downloads, and downloads themselves, can be disabled with IE6 and XP SP2.  Previous versions of IE allowed you to disable downloads, but the prompt disable was new to me.

Long story short, if your users aren’t being prompted to download the output file, change the IE settings by navigationg Tools >> Internet Options >> Security >> Custom Level, and make sure “Automatic promting for file downloads” and “file download” are both enabled.