在从一个Web页面转换到另一个Web页面时你的ASPNET应用程序的用户界面的某些部分常常是保持不变的——如某些装饰的部分页眉处的GIF图片水平工具条或导航条左侧的链接等等你可以继续用它们而不必为每个页面重建
在过去一个流行的ASP技术就是为一个页面的每个主要部分创建一个include文件然后建一个整体的HTML表表的单元包含每个include文件这种方法是可行的但是不美观还容易出错幸运的是ASPNET可以让你用一种更好的方法来解决这个问题运用一个Visual Studio NET PlaceHolder Web控件该控件将其它控件作为一个集合(collection)包含起来你可以在运行时清除那个collection或添加它例如你可以在运行时添加一个Web用户控件(一个模块式的Web页面)我将讲述如何将PlaceHolder Web控件同Web用户控件结合起来运用为构建ASPNET应用程序提供一个方法
首先在VSNET中创建一个新的ASPNET Web应用程序我在样例代码中用的是C#创建一个Web窗体保存的文件带有ASPX扩展名我称其为我的mainaspx该页面是你的应用程序中唯一的Web页面因为你用Web用户控件(ASCX文件)来开发所有的页面内容
在mainaspx页面中创建你选择的站点装饰内容在你想放置站点丰富内容地方添加一个PlaceHolder控件然后将下面的代码添加到你的页面的Page Load事件中
private void Page_Load(object sender
SystemEventArgs e)
{
string p = RequestQueryStringGet(p);
PlaceHolderControlsClear();
if (p == null)
PlaceHolderControlsAdd(LoadControl
(modules/ + Default + ascx));
else
{
PlaceHolderControlsAdd(LoadControl
(modules/ + p + ascx));
}
}
通过该代码你可以在项目模块文件夹中看到一个包含Web用户控件页面(ASCX)的名字的查询字符串参数p你不用将所有ASCX文件都放在一个单独的文件夹中但这么做的确可以进一步隔离应用程序
一旦你得到那个字符串后清空PlaceHolder的Controls集合清除你在先前可能显示的任何ASCX然后查看一下代码看你是否需要加载一个缺省的ASCX最后如果p查询字符串是请求的一部分那么由p查询字符串代表的页面就被加载了
你不需要费很大的劲构建代码来在你的站点上显示多个Web页面在你的VSNET项目中添加一个新的Web用户控件页面一旦你添加了这个页面你就可以把它当作你的应用程序中的唯一的页面来设计并编写代码了你甚至不需要知道它将在mainaspx页面中运行当然如果该页面需要与主页面交互情况并没有这么简单但在这里我并不打算讲述这个问题
图 保持你的Web GUIs的恆量元素
设想你需要在VSNET开发环境中显示一个Account Logon用户控件(见图)代码只给开发人员提供与该页面细节相关的UI没有办法改变整体页面的其它方面
现在当你在一个浏览器中运行http://localhost/CSCSdotNET/mainaspx时首先加载了defaultascx页面这是由于mainaspx的Page Load事件的缘故要导航到Login页面你只需将一个p查询字符串参数添加到请求——在这个例子中运用URL http://localhost/CSCSdotNET/mainaspx?p=AccountLogon现在显示的就是整个mainaspx页面以及你在图中看到的动态加载的AccountLogonascs Web用户控件