Well, it *is* a user control, it just does not have the .ascx declarative file. In other words, I created a regular class and had it implement PortalModuleBase like this:
public class Gallery : DotNetNuke.Entities.Modules.PortalModuleBase
Then, in the manifest, notice how I reference the Gallery class instead of a .ascx file:
<component type="Module">
<desktopModule>
<moduleName>TechInfoSystems.GalleryServerPro</moduleName>
<foldername>GalleryServerPro</foldername>
<businessControllerClass>GalleryServerPro.Web.GalleryServerProController</businessControllerClass>
<supportedFeatures />
<moduleDefinitions>
<moduleDefinition>
<friendlyName>Gallery Server Pro</friendlyName>
<defaultCacheTime>0</defaultCacheTime>
<moduleControls>
<moduleControl>
<controlKey />
<controlSrc>GalleryServerPro.Web.Gallery, TechInfoSystems.GalleryServerPro</controlSrc>
<supportsPartialRendering>False</supportsPartialRendering>
<controlTitle />
<controlType>View</controlType>
<iconFile />
<helpUrl />
<viewOrder>0</viewOrder>
</moduleControl>
</moduleControls>
</moduleDefinition>
</moduleDefinitions>
</desktopModule>
<eventMessage>
<processorType>DotNetNuke.Entities.Modules.EventMessageProcessor, DotNetNuke</processorType>
<processorCommand>UpgradeModule</processorCommand>
<attributes>
<businessControllerClass>GalleryServerPro.Web.GalleryServerProController</businessControllerClass>
<desktopModuleID>[DESKTOPMODULEID]</desktopModuleID>
<upgradeVersionsList>01.00.00</upgradeVersionsList>
</attributes>
</eventMessage>
</component>
The reason I did it this way is two-fold:
1. The application I am porting from is already architected this way and I want to minimize changes.
2. The original app was this way because the Gallery user control can be thought of as a controller class whose job it is is to determine - based on query string - which user control to load. IOW, this control's primary job is to dynamically load the desired control. As such it has no UI and no need for a .ascx file.
As for what it looks like when dropped on a page, I believe it looks like any other module, since it *is* a user control and inherits from PortalModuleBase.
The original, unported application is an open source gallery and can be found at Gallery Server Pro.
Hope this helps,
Roger