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

 public abstract class StaticBase : IDisposable
{
/// <summary>
/// 默认编码方式
/// </summary>
protected Encoding code = Encoding.GetEncoding("utf-8");
/// <summary>
/// 写入页面数据流
/// </summary>
protected StreamWriter sw = null;
/// <summary>
/// 读取页面数据流
/// </summary>
protected StreamReader sr = null;
/// <summary>
/// 生成的静态页面保存文件夹路径
/// </summary>
protected string SavePath = "/Default/";
/// <summary>
/// 模板页面的文件夹路径
/// </summary>
protected string PagePath = "/Master/";
public abstract bool Osucess { set; get; }
public abstract string Errorstring { set; get; }
/// <summary>
/// 具体生成静态方法
/// </summary>
protected abstract bool WriteFile();
/// <summary>
/// 不同模块的文件名称
/// </summary>
protected Dictionary<FlagsFileName, string> FileName
{
get
{
return new Dictionary<FlagsFileName, string>
{
{FlagsFileName.News,"article"},
{FlagsFileName.head,"head"},
{FlagsFileName.foot,"foot"},
};
}
}
// http://www.cnblogs.com/roucheng/
#region IDisposable 成员 public void Dispose()
{
sw.Dispose();
sr.Dispose();
} #endregion
}
#region 对应的页面名称
/// <summary>
/// 对应的页面名称
/// </summary>
public enum FlagsFileName : byte
{
/// <summary>
/// 新闻
/// </summary>
[Description("新闻")]
News = ,
/// <summary>
/// 头部
/// </summary>
[Description("头部")]
head=,
/// <summary>
/// 脚部
/// </summary>
[Description("脚部")]
foot=,
}

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

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

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

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>$Titles$</title>
</script>
</head>
<body>
<div id="wrap">
$head$
<!--hd end-->
<div class="clear"></div>
<div id="wp">
<table border="0" cellpadding="0" cellspacing="0" width="980">
<tr>
<td rowspan="3" valign="top" id="main_box" class="index_box2">
<div class="subtitle subtitle4"></div>
<div class="article">
<div class="title">$Titles$</div>
$Contents_tw$
</div> </td>
<td width="48" height="44" class="ri_top">&nbsp;</td>
</tr>
<tr>
<td class="ri_mid" id="mid_box">&nbsp;</td>
</tr>
<tr>
<td height="44" class="ri_bottom">&nbsp;</td>
</tr>
</table>
</div>
<!--wp end-->
</div>
<!--wrap end--> $foot$
<!--ft end-->
</body>
</html>

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

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

 public class ViewPage : StaticBase
{
/// <summary>
/// 是否操作成功
/// </summary>
private bool o_sucess = true;
/// <summary>
/// 错误信息
/// </summary>
private string errorstring = string.Empty;
/// <summary>
/// 模板文件名称
/// </summary>
private string masterhtml;
/// <summary>
/// 数据源
/// </summary>
private IEnumerable<DataRow> rowlist;
/// <summary>
/// 模块类别
/// </summary>
private FlagsFileName fname;
/// <summary>
/// 指定命名文件的标志列(从数据库中的字段)
/// </summary>
private string thekey;
public override bool Osucess
{
get { return o_sucess; }
set { o_sucess = value; }
}
public override string Errorstring
{
get { return errorstring; }
set { errorstring = value; }
}
/// <summary>
/// 构造器静态生成对象
/// </summary>
/// <param name="rlist">需要生成静态文件的数据源</param>
/// <param name="fn">文件类别枚举</param>
/// <param name="myid">此字段为数据库表中字段,由该字段指定生成的文件名字标志 </param>
public ViewPage(DataRow[] rlist,FlagsFileName fn,string myid)
{
this.thekey = myid;
this.fname = fn;
this.rowlist = rlist;
this.masterhtml = FileName[fn] + ".html";
WriteFile();
} protected override bool WriteFile()
{
string str = "";
try//从指定模板文件中读取html代码
{
sr = new StreamReader(HttpContext.Current.Server.MapPath(PagePath + this.masterhtml), code);
str = sr.ReadToEnd();
}
catch (Exception ex)//异常则指定返回的错误信息
{
sr.Close();
sr.Dispose();
this.o_sucess = false;
this.errorstring = ex.Message;
return this.o_sucess;
}
sr.Close();
sr.Dispose();
List<FlagsFileName> fn = new List<FlagsFileName>();
fn.Add(FlagsFileName.head);
fn.Add(FlagsFileName.foot);
PointPage pg = new PointPage(fn, str);
//要保存的文件名称
string htmlfilename = string.Empty;
string changestring = "";//要更改的字符串
foreach (DataRow row in this.rowlist)//遍历数据源数组中的每个数据表
{
string newString = str;
try
{
htmlfilename = FileName[fname] + "_" + row[thekey].ToString() + ".html";//给文件命名
foreach (DataColumn c in row.Table.Columns)//遍历单个数据表的列名
{
changestring = "$" + c.ColumnName + "$";
newString = newString.Replace(changestring, row[c].ToString());
}
sw = new StreamWriter(HttpContext.Current.Server.MapPath(SavePath + htmlfilename), false, code);
sw.Write(newString);
sw.Flush();
}
catch (Exception ex)
{
this.o_sucess = false;
this.errorstring = ex.Message;
return this.o_sucess;
} }
sw.Dispose();
sw.Close();
return true;
}
}

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

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

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

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

c#生成静态html文件,封装类的更多相关文章

  1. 比较ASP生成静态HTML文件的几种方法

    将动态页面转换生成静态Html文件有许多好处,比如生成html网页有利于被搜索引擎收录(特别是对接受动态参数的页面).前台访问时,脱离了数据访问,减轻对数据库访问的压力,加快网页打开速度. 当然,凡事 ...

  2. Makefile学习(二)----生成静态库文件

    Lunix下编译静态库文件: .o后缀文件:编译生成的中间代码文件: .a后缀文件:静态库文件,编译的时候会合到可执行程序中,文件比较大: .so后缀文件:动态库文件,只是一个指向,不会合到可执行程序 ...

  3. FreeMarker 乱码解决方案 生成静态html文件

    读取模板的时候有一个编码: Template template = this.tempConfiguration.getTemplate(templatePath,"UTF-8") ...

  4. springmvc+freemarker生成静态html文件

    参考资料: http://mylfd.iteye.com/blog/1896501 http://www.cnblogs.com/xxt19970908/p/5553045.html 个人实践: 1. ...

  5. 减少服务器压力php生成静态xml文件

    一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...

  6. .PHP生成静态html文件的方法

    1. [代码][PHP]代码     1,下面使用模版的一个方法!   <?php $fp = fopen ("templets.html","a");  ...

  7. Java生成静态HTML文件

    private static final String FILEPATH = "/opt/nginx/html/banner/"; private static final Str ...

  8. IOS 生成静态库文件(.framework)

    http://blog.csdn.net/zwl492454828/article/details/55095422

  9. IOS 生成静态库文件(.a文件)

    http://www.cnblogs.com/lyy-5518/p/5459643.html

随机推荐

  1. PHP类和对象之重载

    PHP中的重载指的是动态的创建属性与方法,是通过魔术方法来实现的.属性的重载通过__set,__get,__isset,__unset来分别实现对不存在属性的赋值.读取.判断属性是否设置.销毁属性. ...

  2. 卸载oracle之后,如何清除注册表

    之前卸载了oracle,今天偶然间发现,在服务和应用程序里面,还残存着之前的oracle服务.原来,还需要去清理下注册表. 在开始菜单的这个框里面 输入regedit,进入注册表.找到这个目录 HKE ...

  3. .NET面试题集锦①(Part一)

    一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...

  4. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  5. CSS3自定义滚动条样式 -webkit-scrollbar(转)

    有没有觉得浏览器自带的原始滚动条很不美观,同时也有看到很多网站的自定义滚动条显得高端,就连chrome32.0开发板都抛弃了原始的滚动条,美观多了.那webkit浏览器是如何自定义滚动条的呢? 前言 ...

  6. SharePonit 2010 更改另存为列表模板的语言类型

    从朋友处得来一个列表模板:AccessApplicationSharePoint.stp 将其通过:网站操作----网站设置----列表模板,上传进去.然后去创建列表,发现找不到此模板. 根据多年老司 ...

  7. 2-1 Linux 操作系统及常用命令

    根据马哥linux初级视频 2-1.2-2来编辑 1. GUI与CLI GUI: Graphic User Interface CLI: Command Line Interface 注:在Windo ...

  8. 【C#】获取网页内容及HTML解析器HtmlAgilityPack的使用

    最近经常需要下载一些东西,而这个下载地址又会经过层层跳转,每个页面上都有很多广告,烦不胜烦,所以做了一个一键获得最终下载地址的小工具.使用C#,来获取网页内容,然后通过HtmlAgilityPack获 ...

  9. MongoDB CRUD 操作手册

    基本操作 增加 在MongoDB中通过db.collection.insert()来增加新的数据. db.users.insert({username:"Jack",age:30} ...

  10. ADO.NET Entity Framework 在哪些场景下使用?

    在知乎回答了下,顺手转回来. Enity Framework已经是.NET下最主要的ORM了.而ORM从一个Mapping的概念开始,到现在已经得到了一定的升华,特别是EF等对ORM框架面向对象能力的 ...