The way I choose to get around this is to have my module do the loading of the ASCX files instead of letting DNN do it with the various ControlKey parameters.
My DnnSimpleArticle module is a good example of how to do this http://dnnsimplearticle.codeplex.com/
Basically the View.ascx file consists of a Placeholder
<asp:PlaceHolder ID="phViewControl" runat="server" />
The codebehind for that control does the loading
try
{
var controlToLoad = "Controls/ArticleList.ascx";
if (ArticleId > 0)
{
controlToLoad = "Controls/ArticleView.ascx";
}
var mbl = (dnnsimplearticleModuleBase)LoadControl(controlToLoad);
mbl.ModuleConfiguration = ModuleConfiguration;
mbl.ID = System.IO.Path.GetFileNameWithoutExtension(controlToLoad);
phViewControl.Controls.Add(mbl);
}
catch (Exception exc)
{
Exceptions.ProcessModuleLoadException(this, exc);
}
That is my preferred method of having complete control over what gets loaded in DNN (allowing for other modules to remain in the page)