cnforum使用MasterPages实现Web窗体模板
如果你是一个网页开发人员,面对大量含有重复内容的页面,你一定希望能利用“模板”定义网页内的公共部分,而每一个页面只需要完成其特有的内容,通过模板生成最终的页面。
熟悉Dreamweaver的网页开发人员都会喜欢其中的模板(Template)功能。但是当我们转换到了ASP.NET平台,却不得不使用一个基本上只能算是文本编辑器的微软开发环境(当然这应该是一个最完美的文本编辑器),微软在图形化网页设计方面也只能算是一个门外汉。尽管如此,即使没有所见即所得的图形化设计界面,微软以及其他开源志士们还是为我们提供了丰富的Web窗体前端控件。其中的MasterPages可以说是最有用的,因为它实现了Dreamweaver中的模板功能,而且在ASP.NET框架的支持下,使用模板变得更简便,我们甚至可以编程为自己的模板添加许多功能。
使用MasterPages实现Web窗体模板
定义模板控件
如果我们的窗体布局分为上中下三部分,而中间的部分是特定内容区域,那么最终的模板内容可以像下面这样:
<%@ Register TagPrefix="mp" namespace="Microsoft.Web.Samples.MasterPages" assembly="MasterPages" %>
<html>
<body>
<FORM runat="server">
<TABLE width="100%" border=1>
<TR><TD>页眉</TD></TR>
<TR><TD><mp:region id="regContent" runat="server">窗体内容</mp:region></TD></TR>
<TR><TD>页脚</TD></TR>
</TABLE>
</FORM>
</body>
</html>
<html>
<body>
<FORM runat="server">
<TABLE width="100%" border=1>
<TR><TD>页眉</TD></TR>
<TR><TD><mp:region id="regContent" runat="server">窗体内容</mp:region></TD></TR>
<TR><TD>页脚</TD></TR>
</TABLE>
</FORM>
</body>
</html>
2、在UserControl的HTML源代码的头部有这样一行:
这是为页面注册一个自定义的Tab标签,有了这个标签,才能使用MasterPages提供的各种控件。
3、为模板设计窗体的公共部分,这些内容和普通的HTML页面、ASP.NET Web窗体没有任何区别,如果你的网页使用了其他UserControl,而这些UserControl也是公共的,那么同样可以在这个模板内添加。总之,写一个模板控件与设计一个Web窗体没有什么区别,我们所要做的,仅仅是保留窗体内的公共内容,除去特定内容。
4、在Web窗体内特定内容的位置,使用控件标记代替。在以上这个例子中,regContent就是窗体特定内容的区域,每一个窗体将在这里填入自己的内容。
在窗体内使用模板
如果使用刚才给出的模板示例,窗体的HTML源代码如下:
<%@ language="c#" debug="true" trace="false" %>
<%@ Register TagPrefix="mp" namespace="Microsoft.Web.Samples.MasterPages" assembly="MasterPages" %>
<mp:contentcontainer runat="server" MasterPageFile="~/Template.ascx" id="Test">
<mp:content id="regContent" runat="server">窗体内容测试</mp:content>
</mp:contentcontainer>
<%@ Register TagPrefix="mp" namespace="Microsoft.Web.Samples.MasterPages" assembly="MasterPages" %>
<mp:contentcontainer runat="server" MasterPageFile="~/Template.ascx" id="Test">
<mp:content id="regContent" runat="server">窗体内容测试</mp:content>
</mp:contentcontainer>
1、和模板控件一样,使用MasterPages之前必须先注册其Tag(代码头部的第二行)。
2、在窗体内添加一个mp:contentcontainer的控件,上面的例子里它有三个属性:
runat="server"——这个是所有Web控件必须具备的属性;
MasterPageFile="~/Template.ascx"——告诉contentcontainer控件,此窗体使用的模板控件为Web根路径下的Template.ascx文件;
id="Test"——这个属性并不是必须的,但是如果没有或者在所有使用这个模板的窗体内此id有重复,在窗体的设计界面中我们将无法看见窗体的可视化结果,而仅仅显示一个contentcontainer控件标记。
3、在之间加入,也就是窗体自身的内容,它的id必须和模板中定义的region对应。在以上这个例子中,只有一个content——regContent——它对应了模板中id为regContent的region。
现在,模板和窗体都可以正常工作了。它们生成的结果就等同于这样一个窗体:
<%@ language="c#" debug="true" trace="false" %>
<html>
<body>
<FORM runat="server">
<TABLE width="100%" border=1>
<TR><TD>页眉</TD></TR>
<TR><TD>窗体内容测试</TD></TR>
<TR><TD>页脚</TD></TR>
</TABLE>
</FORM>
</body>
</html>
<html>
<body>
<FORM runat="server">
<TABLE width="100%" border=1>
<TR><TD>页眉</TD></TR>
<TR><TD>窗体内容测试</TD></TR>
<TR><TD>页脚</TD></TR>
</TABLE>
</FORM>
</body>
</html>