I approved a forum post by Bill so I decided to blog about his question. I thought this might be useful to those who read my blog.
As many of you may already know, this module actually was spawned from a CodeProject sample. There is almost nothing left from this except a few basic architectual elements and how these UI's are done is one. The module has undergone many transitions to get to where it is today. We have been looking into how we should properly handle the theme/skinning so this piece has remained this long. We felt it was more important to have a solid foundation rather than an easily customizable UI. There is a performance gain for rendering the UI in the code, but we are willing to sacrifice some performance if we can come up with a very good 'skinning' solution. Also note that the two Search results UI's (portal and forum searches are handled seperately because one is a post view and the other is a thread view plus there are some differences between the incoming querystring parameters) and one of the Moderation UI's are also rendered in this manner (moderation queue).
Now, to touch on Bill's question about nTier thoughts. The reality is this module still adheres to this for the most part. Just because there is no ascx doesn't mean we are not using the nTier approach. nTier simply means you seperate those tiers logically (I guess Bill does have a point because nTier is not necessarily a specifically numbered tier). The actual HTML used is the Presentation GUI Tier, but in the case of this module it is being done in the Presentation Logic Tier. Those two actually combine to make the 4th tier in this module, but would be seperate in a 5 tier approach which is what most of DotNetNuke uses. In this 4 Tier, we render the html server side then send that rendered html to the client. In the 5 Tier approach, the HTML would be read from the ascx file on disk, then sent to the client.
To sum all this up with the most honest answer I can give: this is currently done like this because it worked the way it was and before replacing it, we needed to find an easily customizable solution that didn't really impact performance. We didn't want to spend time working on only a temp solution. If you live in an area where it snow's, think of it like filling a pothole in the winter until summer comes and you can repave the entire road.