ASP.NET的模板实现(c#)

** 前言 ** ** **

在以前(或许现在),当我们在做 WEB 项目的时候,常常会用到一些共用文件,比如整页的顶部(页眉),左部(导航),底部(页脚)等等一些共用的 HTML , ASP 等文件,即便如此,我们也需要预先为这些文件做好框架的样式(一般是用 table 吧 ?! 没几个会用 DIV 吧),以组合( include )这些文件得到一个完整的页面,这些共用文件的组合,这里假设把它定义成模板(尽管模板的真正含义可能远不止此)。即便如此,当我们项目中整个框架发生变动时,我们不得修改原先通过 table 等等一些 HTML 标签定义好的每个需要这样模板的页面,而这样的工作尽管可以通过 ctrl+c 和 ctrl+v 来完成,但同时工作量也是巨大的,耗时的。

** 发展 ** ** **

在 ASP.NET 里,使用的是面向对象的开发模式,可以这么理解 --- 每个页面都是一个从 SystemWeb.UI.Page 继承的 Class ,这个类给我们提供了一些诸如缓存,表示,应答,请求等服务(说是方法也行)。通过面向对象的方法是不是有比用 include 更好的解决方法呢?当然,答案是肯定的。

** 实现 ** ** **

记得有句名言叫“任何问题都可以通过加入一个中间层来实现”,举个很简单的例子,我们常常使用 Façade 这个模式降低系统的 耦合 度,而我们又为什么要使用设计模式呢?主要是用来减小耦合提高复用的。

从所有的 ASPX 页面都由 SystemWeb.UI.Page 继承而来这点上来看,我们只需在 ASPX 和 SystemWeb.UI.Page 之间加入一层,写一个我们自己的 Class 就可以使问题变得简单化,而在 .NET 框架中,允许用户自定义 HTML 代码(这点可以参考 Web User Controls ),这样解决问题的雏形就出来了,见下图。

图中的“自定义类”就相当于我们加入的一个中间层,该自定类继承 System.Web.UI.Page 这个基类,下面给出自定类的代码:

PageBase.cs

public class PageBase:System.Web.UI.Page

{

public string PageTitle="测试模板";

protected override void Render(System.Web.UI.HtmlTextWriter writer)

{

writer.Write(@"

 1<html><head>
 2<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
 3<title>" +  this  .PageTitle + "</title></head>"); 
 4
 5writer.Write(@"<body>
 6<table border="0" width="680">
 7<tr>
 8<td align="center" bgcolor="#006699" width="160"><font color="#FFFFFF"><b><a href="index.aspx">首页</a></b></font></td>
 9<td colspan="2" width="520">广告条</td>
10</tr>
11<tr>
12<td valign="top" width="160">
13<p>导航</p>
14<p><a href="newContact.aspx">添加联系人</a></p>
15<p>查找联系人</p>
16</td>
17<td width="10"> </td>
18<td width="510">
19
20"); 
21
22base  .Render(writer); 
23
24writer.Write(@"</td></tr><tr><td colspan="3" width="100%">页脚 </td></tr></table></body></html>

");

}

}


上面的 PageBase.cs 就是我们的自定类,这样,我们在其他 ASPX 页面中就可以直接继承 PageBase 这个类,而非 System.Web.UI.Page ,下面分别是 index.aspx 和 newContact.aspx 的代码(分别包含 index.aspx.cs 和 newContact.aspx.cs ):

Index.aspx

1@ Page language="c#" Codebehind="index.aspx.cs" AutoEventWireup="false" Inherits="wab.index" 
1<form id="index" method="post" runat="server">
2<asp:datagrid height="104px" id="contacts" runat="server" width="492px"></asp:datagrid>
3</form>

index.aspx.cs (继承自定义类 PageBase )

public class index : PageBase

{

protected System.Web.UI.WebControls.DataGrid contacts;

private void Page_Load(object sender, System.EventArgs e)

{

// 在此处放置用户代码以初始化页面

}

#region Web Form Designer generated code

override protected void OnInit(EventArgs e)

{

//

// CODEGEN :该调用是 ASP.NET Web 窗体设计器所必需的。

//

InitializeComponent();

base.OnInit(e);

}

///

1<summary>
2
3///  设计器支持所需的方法  \-  不要使用代码编辑器修改 
4
5///  此方法的内容。 
6
7/// </summary>

private void InitializeComponent()

{

this.Load += new System.EventHandler(this.Page_Load);

}

#endregion

}

newContact.aspx

1@ Page language="c#" Codebehind="newContact.aspx.cs" AutoEventWireup="false" Inherits="wab.newContact" 
1<form id="newContact" method="post" runat="server">
2<p><font face="  宋体  "> 名子  </font>
3<asp:textbox id="TextBox1" runat="server"></asp:textbox></p>
4<p><font face="  宋体  "> 姓氏  </font>
5<asp:textbox id="TextBox2" runat="server"></asp:textbox></p>
6<p>
7<asp:button id="Button1" runat="server" text="Button"></asp:button></p>
8</form>

newContact.aspx.cs (继承自定类 PageBase )

public class newContact : PageBase

{

protected System.Web.UI.WebControls.TextBox TextBox1;

protected System.Web.UI.WebControls.Button Button1;

protected System.Web.UI.WebControls.TextBox TextBox2;

private void Page_Load(object sender, System.EventArgs e)

{

}

#region Web Form Designer generated code

override protected void OnInit(EventArgs e)

{

//

// CODEGEN :该调用是 ASP.NET Web 窗体设计器所必需的。

//

InitializeComponent();

base.OnInit(e);

}

///

1<summary>
2
3///  设计器支持所需的方法  \-  不要使用代码编辑器修改 
4
5///  此方法的内容。 
6
7/// </summary>

private void InitializeComponent()

{

this.Load += new System.EventHandler(this.Page_Load);

}

#endregion

}


以上就是 ASP.NET 中模板基本的实现方法,不过在此先声明一点,这么做会让系统的性能下降一点点,但是这一点点并不影响实际项目,但我相信这一点点的系统性能换来的是日后维护的方便,相信很值得。

Windows 2000 server + Visual Studio.net ( .NET Framework 1.0 )下测试通过。

补充:文章中如有不到之处,请指正,以便即时改动。

Published At
Categories with Web编程
Tagged with
comments powered by Disqus