c#生成静态html文件,封装类

由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

c#生成静态html文件,封装类此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“”,获取验证码。在微信里搜索“”或者“”或者微信扫描右侧二维码都可以关注本站微信公众号。

由于这段时间比较轻松,于是想到很多的企业网站,新闻网站需要将页面静态化,于是写了个封装类来实现静态文件的生成,思路比较简单,但未完善,网友可根据自己的思路将此类扩展,运用了简单工厂模式(本来刚开始看设计模式,是个好书),好了,废话不多说,先来看看静态类的父类:StaticBase(抽象类)

 1 public abstract class StaticBase : IDisposable  2  {  3 /// <summary>  4 /// 默认编码方式  5 /// </summary>  6 protected Encoding code = Encoding.GetEncoding("utf-8");  7 /// <summary>  8 /// 写入页面数据流  9 /// </summary> 10 protected StreamWriter sw = null; 11 /// <summary> 12 /// 读取页面数据流 13 /// </summary> 14 protected StreamReader sr = null; 15 /// <summary> 16 /// 生成的静态页面保存文件夹路径 17 /// </summary> 18 protected string SavePath = "/Default/"; 19 /// <summary> 20 /// 模板页面的文件夹路径 21 /// </summary> 22 protected string PagePath = "/Master/"; 23 public abstract bool Osucess { set; get; } 24 public abstract string Errorstring { set; get; } 25 /// <summary> 26 /// 具体生成静态方法 27 /// </summary> 28 protected abstract bool WriteFile(); 29 /// <summary> 30 /// 不同模块的文件名称 31 /// </summary> 32 protected Dictionary<FlagsFileName, string> FileName 33  { 34 get 35  { 36 return new Dictionary<FlagsFileName, string> 37  { 38 {FlagsFileName.News,"article"}, 39 {FlagsFileName.head,"head"}, 40 {FlagsFileName.foot,"foot"}, 41  }; 42  } 43  } 44 // http://www.cnblogs.com/roucheng/ 45 #region IDisposable 成员 46 47 public void Dispose() 48  { 49  sw.Dispose(); 50  sr.Dispose(); 51  } 52 53 #endregion 54  } 55 #region 对应的页面名称 56 /// <summary> 57 /// 对应的页面名称 58 /// </summary> 59 public enum FlagsFileName : byte 60  { 61 /// <summary> 62 /// 新闻 63 /// </summary> 64 [Description("新闻")] 65 News = 0, 66 /// <summary> 67 /// 头部 68 /// </summary> 69 [Description("头部")] 70 head=1, 71 /// <summary> 72 /// 脚部 73 /// </summary> 74 [Description("脚部")] 75 foot=2, 76 }

最后的一个枚举用于定义不同位置或不同类别的静态页所对应的子类

,接下来看看其中一个子类的实现(该子类是用于所有单页,如数据库中有100条新闻记录,那相应的生成100个新闻html页面,格式用模板定义的格式确定)

首先模板文件时静态的html页面,其中所有的需要从数据库中替换的字段用一对$包含,如数据库中的新闻标题字段为titles,则模板页中相应的标题位置用$titles$表示,页面如下

 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  2 <html xmlns="http://www.w3.org/1999/xhtml">  3 <head>  4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  5 <title>$Titles$</title>  6 </script>  7 </head>  8 <body>  9 <div id="wrap"> 10  $head$ 11 <!--hd end--> 12 <div class="clear"></div> 13 <div id="wp"> 14 <table border="0" cellpadding="0" cellspacing="0" width="980"> 15 <tr> 16 <td rowspan="3" valign="top" id="main_box" class="index_box2"> 17 <div class="subtitle subtitle4"></div> 18 <div class="article"> 19 <div class="title">$Titles$</div> 20  $Contents_tw$ 21 </div> 22 23 24 </td> 25 <td width="48" height="44" class="ri_top">&nbsp;</td> 26 </tr> 27 <tr> 28 <td class="ri_mid" id="mid_box">&nbsp;</td> 29 </tr> 30 <tr> 31 <td height="44" class="ri_bottom">&nbsp;</td> 32 </tr> 33 </table> 34 </div> 35 <!--wp end--> 36 </div> 37 <!--wrap end--> 38 39 $foot$ 40 <!--ft end--> 41 </body> 42 </html>

http://www.cnblogs.com/roucheng/

到这里知道个大概了吧,接下来就是这中页面类型的子类实现,我将它的名称定义为ViewPage,因为所有可以单独显示的页面都可以用这个子类,代码如下

 1 public class ViewPage : StaticBase  2  {  3 /// <summary>  4 /// 是否操作成功  5 /// </summary>  6 private bool o_sucess = true;  7 /// <summary>  8 /// 错误信息  9 /// </summary>  10 private string errorstring = string.Empty;  11 /// <summary>  12 /// 模板文件名称  13 /// </summary>  14 private string masterhtml;  15 /// <summary>  16 /// 数据源  17 /// </summary>  18 private IEnumerable<DataRow> rowlist;  19 /// <summary>  20 /// 模块类别  21 /// </summary>  22 private FlagsFileName fname;  23 /// <summary>  24 /// 指定命名文件的标志列(从数据库中的字段)  25 /// </summary>  26 private string thekey;  27 public override bool Osucess  28  {  29 get { return o_sucess; }  30 set { o_sucess = value; }  31  }  32 public override string Errorstring  33  {  34 get { return errorstring; }  35 set { errorstring = value; }  36  }  37 /// <summary>  38 /// 构造器静态生成对象  39 /// </summary>  40 /// <param name="rlist">需要生成静态文件的数据源</param>  41 /// <param name="fn">文件类别枚举</param>  42 /// <param name="myid">此字段为数据库表中字段,由该字段指定生成的文件名字标志 </param>  43 public ViewPage(DataRow[] rlist,FlagsFileName fn,string myid)  44  {  45 this.thekey = myid;  46 this.fname = fn;  47 this.rowlist = rlist;  48 this.masterhtml = FileName[fn] + ".html";  49  WriteFile();  50  }  51  52 protected override bool WriteFile()  53  {  54 string str = "";  55 try//从指定模板文件中读取html代码  56  {  57 sr = new StreamReader(HttpContext.Current.Server.MapPath(PagePath + this.masterhtml), code);  58 str = sr.ReadToEnd();  59  }  60 catch (Exception ex)//异常则指定返回的错误信息   61  {  62  sr.Close();  63  sr.Dispose();  64 this.o_sucess = false;  65 this.errorstring = ex.Message;  66 return this.o_sucess;  67  }  68  sr.Close();  69  sr.Dispose();  70 List<FlagsFileName> fn = new List<FlagsFileName>();  71  fn.Add(FlagsFileName.head);  72  fn.Add(FlagsFileName.foot);  73 PointPage pg = new PointPage(fn, str);  74 //要保存的文件名称  75 string htmlfilename = string.Empty;  76 string changestring = "";//要更改的字符串  77 foreach (DataRow row in this.rowlist)//遍历数据源数组中的每个数据表  78  {  79 string newString = str;  80 try  81  {  82 htmlfilename = FileName[fname] + "_" + row[thekey].ToString() + ".html";//给文件命名  83 foreach (DataColumn c in row.Table.Columns)//遍历单个数据表的列名  84  {  85 changestring = "$" + c.ColumnName + "$";  86 newString = newString.Replace(changestring, row[c].ToString());  87  }  88 sw = new StreamWriter(HttpContext.Current.Server.MapPath(SavePath + htmlfilename), false, code);  89  sw.Write(newString);  90  sw.Flush();  91  }  92 catch (Exception ex)  93  {  94 this.o_sucess = false;  95 this.errorstring = ex.Message;  96 return this.o_sucess;  97  }  98  99  } 100  sw.Dispose(); 101  sw.Close(); 102 return true; 103  } 104 }

好,到这里实现了底层的思路设计,那调用就很简单了,某个aspx页面,一个按钮button,一个点击事件Button_Click,点击事件内需要做的就是声明一个基类StaticBase,将它实例化成一个子类ViewPage,传递的参数为一个数据项集合,DataRow[]为从数据表中读取的集合,包含需要替换的字段,如select titles,contens,id from news(从新闻表中获得标识id,标题,内容),以及类型FlagsFileName.News为前天基类提到过的枚举类型,为单独页面的生成方式,已经重命名的标识列,如此处为id,则生成的页面格式为

news_1.html,news_2.html以此类推,代码如下

 1 protected void Create_Click(object sender, EventArgs e)  2  {  3 IEnumerable<DataRow> rowlist = TNotice_Command.SelectTNotice(-1);  4 using (StaticBase sb = new ViewPage((DataRow[])rowlist, FlagsFileName.News, "NID"))  5  {  6 if (!sb.Osucess)  7  {  8 Response.Write("<script language=javascript>alert('" + sb.Errorstring + "')</script>");  9  } 10  } 11 }

看到这里大家如果再从头看一遍,相信就能知道静态文件的生成的原理了,接下来研究如果生成分页页面的静态文件,文章内容简单,但希望能大家一点思路。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/120729.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • informix数据库建表语句_sqlserver创建数据库

    informix数据库建表语句_sqlserver创建数据库[b]1、安装[/b]a:先到IBM官网下载数据库(企业版本的12.10)b:执行id_stall程序进行安装c:默认创建实例ol_informix1210[color=darkred]d:默认创建的实例是包含了sbspace表空间的,新建的实例默认是不包含表空间的如果需要处理大对象数据(clob)的话,则需要通过onspa…

  • python怎么表示取余_python如何实现取余操作

    python怎么表示取余_python如何实现取余操作python实现取余操作的方法:可以利用求模运算符(%)来实现。求模运算符可以将两个数相除得到其余数。我们还可以使用divmod()函数来实现取余操作,具体方法如:【divmod(10,3)】。在python中要实现取余操作可以使用求模运算符(%),该运算符可以将两个数相除得到其余数。(推荐教程:Python入门教程)如果一个数恰好能被另外一个数据整除,则余数为0,%运算后返回结果为0。可利用余数…

  • Android 蓝牙开发之搜索、配对、连接、通信大全

    Android 蓝牙开发之搜索、配对、连接、通信大全关注微信公众号(文强的技术小屋),学习更多技术知识,一起遨游知识海洋~蓝牙(Bluetooth®):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙设备最多可以同时和7个其它蓝牙设备建立连接,进行通信,当然并不是每一个蓝牙都可以达到最大值。下面,我们从蓝牙的基本概念…

  • webstorm 2021 激活码_最新在线免费激活

    (webstorm 2021 激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

  • linux如何卸载jdk版本并重装_centos卸载jdk

    linux如何卸载jdk版本并重装_centos卸载jdklinuxcentos7自带了openjdk,这个版本的jdk是缺少一部分功能的,最好重新安装oraclejdk。但在没有卸载openjdk就安装oraclejdk时,部分依赖包装不上,后期程序运行时会出现问题。以下为卸载jdk的步骤(openjdk或oraclejdk)和安装步骤。#1.查看目前系统中包含的jdk版本rpm-qa|grepjdk#2.得到的结果如下:java-1.8.0-openjdk-1.8.0.322.b06-1.e

  • 股票代码分类_选择股票从哪几个方面选

    股票代码分类_选择股票从哪几个方面选创业板:创业板的代码是300打头的股票代码沪市A股:沪市A股的代码是以600、601或603打头沪市B股:沪市B股的代码是以900打头深市A股:深市A股的代码是以000打头深圳B股:深圳B股的代码是以

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号