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

原创 2003年08月11日 12:27:00

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

前言

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

发展

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

实现

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

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

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2003-8-9152120.png

 

图中的“自定义类”就相当于我们加入的一个中间层,该自定类继承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(@"<html><head>

                   <meta http-equiv='Content-Type' content='text/html; charset=gb2312'>

                   <title>" + this.PageTitle + "</title></head>");

              writer.Write(@"<body>

                   <table border='0' width='680'>

                       <tr>

                            <td width='160' bgcolor='#006699' align='center'><font color='#FFFFFF'><b><a href='index.aspx'>首页</a></b></font></td>

                            <td colspan='2' width='520'>广告条</td>

                       </tr>

                       <tr>

                            <td width='160' valign='top'>

                                 <p>导航</p>

                                 <p><a href='newContact.aspx'>添加联系人</a></p>

                                 <p>查找联系人</p>

                            </td>

                            <td width='10'> </td>

                            <td width='510'>

              ");

              base.Render(writer);

 

              writer.Write(@"</td></tr><tr><td width='100%' colspan='3'>页脚 </td></tr></table></body></html>");

             

         }

   }

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

Index.aspx

<%@ Page language="c#" Codebehind="index.aspx.cs" AutoEventWireup="false" Inherits="wab.index" %>

<form id="index" method="post" runat="server">

       <asp:DataGrid id="contacts" runat="server" Width="492px" Height="104px"></asp:DataGrid>

</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);

              }

             

              /// <summary>

              /// 设计器支持所需的方法 - 不要使用代码编辑器修改

              /// 此方法的内容。

              /// </summary>

              private void InitializeComponent()

              {   

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

 

              }

              #endregion

       }

newContact.aspx

<%@ Page language="c#" Codebehind="newContact.aspx.cs" AutoEventWireup="false" Inherits="wab.newContact" %>

<form id="newContact" method="post" runat="server">

       <P><FONT face="宋体">名子</FONT>

              <asp:TextBox id="TextBox1" runat="server"></asp:TextBox></P>

       <P><FONT face="宋体">姓氏</FONT>

              <asp:TextBox id="TextBox2" runat="server"></asp:TextBox></P>

       <P>

              <asp:Button id="Button1" runat="server" Text="Button"></asp:Button></P>

</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);

              }

             

              /// <summary>

              /// 设计器支持所需的方法 - 不要使用代码编辑器修改

              /// 此方法的内容。

              /// </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)下测试通过。

 

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

.NET MVC5自带模板方法功能解析(3)--ASP.NET Identity

ASP.NET Identity
  • qq_34149805
  • qq_34149805
  • 2016年11月09日 22:04
  • 1292

.net微信公众号开发——模板消息

本文介绍微信公众号中的模板消息,包括以下内容:(1)TemplateMessage类简介;(2)设置所属行业;(3)获得模板id;(4)发送模板消息;(5)接收推送模板消息发送结果事件。...
  • xrwang
  • xrwang
  • 2015年03月16日 15:04
  • 10114

asp.net下载Excel模板和导入导出Excel功能

1.导入Excel  protected void bt_Import_Click(object sender, EventArgs e)  {             if (!fu_Excel.H...
  • ice_baili
  • ice_baili
  • 2014年01月23日 15:56
  • 1915

C# asp.net 母版页嵌套

如何做一个嵌套的母版页: 1.新建一个父母版页 ...
  • maoxunxing
  • maoxunxing
  • 2013年04月05日 16:53
  • 1800

ASP.net中模板的简单使用

1.新建一个站点,右键站点,添加一个新项,选择 命名为:MasterPage.master 2.修改原先的代码,秩序在body标签中添加一个表格,表格中添加四个内容占位符。 无标...
  • sumirry
  • sumirry
  • 2014年11月29日 11:29
  • 1881

c# 导出excel 通过模板

private void Bind() { //模板文件 string TempletFileName = Server.MapPath("template.x...
  • chuntian1983
  • chuntian1983
  • 2014年01月14日 16:54
  • 2462

【asp.net】GridView中模板的使用

GridView控件的主要用途就是为我们显示数据。但是在GridView中有一些知识是需要我们通过对比去掌握的。...
  • u012331102
  • u012331102
  • 2015年08月07日 16:30
  • 690

ASP.NET MVC公共模板、节、分部视图等

一、公共模板  1、@RenderBody()  在网站公用部分通过一个占位符@RenderBody()来为网站独立部分预留一个位置。然后私有页面顶部通过@{Layout="公用模板路径"}来引入公用...
  • sven_xu
  • sven_xu
  • 2015年06月02日 09:23
  • 1786

asp.net4.0循序渐进(一)新的asp.net网站项目模板

asp.net4.0循序渐进(一)新的asp.net网站项目模板 本次练习,我们将熟悉vs2010提供的asp.net4 网站项目模板 asp.net4.0提供了三种新的网站项目模板1.空的网...
  • finethere
  • finethere
  • 2014年04月25日 10:58
  • 1449

后台动态生成GridView列和模版

考虑到很多数据源是不确定的,所以这时无法在前台设置gridview的表头,需要在后台动态指定并绑定数据。 前台代码如下: "主页" Language="C#" MasterPageFi...
  • hwt0101
  • hwt0101
  • 2014年06月11日 11:29
  • 1712
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET的模板实现(c#)
举报原因:
原因补充:

(最多只允许输入30个字)