因为公司的产品用asp开发, 前一段时间用asp写了一个生成静态页面并分页的程序,但缘于对.net的热爱,写了这个.net下的生成静态页面并分页的程序。
主要的原理就是替换模板里的特殊字符。
1、静态模板页面 template.html,主要是定义了一些特殊字符,用来被替换。
<!
DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"
>
<
html
>
<
head
>
<
meta
http-equiv
="Content-Type"
content
="text/html; charset=gb2312"
>
<
title
>
$Title
</
title
>
</
head
>
<
body
>
<
div
style
="width: 417px; height: 54px"
align
="center"
>
<
br
/>
$Title
</
div
>
<
div
style
="width: 417px; height: 8px"
>
浏览
<
font
color
="red"
><
script
src
="http://localhost/.Net/NewsFiles/ClickCount.aspx?NewsId=$NewsId"
></
script
></
font
>
次 $Time
</
div
>
<
div
style
="width: 417px; height: 100px"
>
$Content
</
div
>
<
div
style
="width: 416px; height: 9px"
>
$Pager
</
div
>
<
div
style
="width: 416px; height: 8px"
>
<
form
id
="form1"
action
="../AddComment.aspx"
style
="margin:0px"
>
<
input
id
="Text1"
type
="text"
/><
Img
id
="Image1"
src
="../../UserInfo/CheckCode.aspx"
/><
br
/>
<
textarea
id
="CommentContent"
cols
="20"
rows
="2"
></
textarea
>
<
br
/>
<
input
id
="NewsId"
type
="hidden"
value
="$NewsId"
/>
<
input
id
="Button1"
type
="submit"
value
="button"
/>
<
a
href
="../Display.aspx?NewsId=$NewsId"
>
查看更多评论
</
a
></
form
>
</
div
>
</
body
>
</
html
>
2、前态页面 NewsAdd.aspx,就是一个表单,用来填写新闻的标题和内容。
<%
...
@ Page Language = " C# " AutoEventWireup = " false " validateRequest = " false " CodeFile = " NewsAdd.aspx.cs " Inherits = " NewsAdd.Admin_AdminPanel_NewsAdd "
%>
<%
...
@ Register TagPrefix = " FCKeditorV2 " Namespace = " FredCK.FCKeditorV2 " Assembly = " FredCK.FCKeditorV2 "
%>
<!
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
runat
="server"
>
<
title
>
添加新闻
</
title
>
</
head
>
<
body
>
<
form
id
="form1"
runat
="server"
>
<
div
>
<
asp:Label
ID
="Label2"
runat
="server"
Text
="标题"
></
asp:Label
>
<
asp:TextBox
ID
="Title"
runat
="server"
Width
="325px"
></
asp:TextBox
><
br
/>
<
asp:Label
ID
="Label1"
runat
="server"
Text
="内容"
></
asp:Label
>
<
FCKeditorV2:FCKeditor
id
="Content"
basePath
="~/FCKeditor/"
runat
="server"
Height
="400px"
Width
="70%"
></
FCKeditorV2:FCKeditor
>
<
asp:Button
ID
="Button1"
runat
="server"
OnClick
="Button1_Click"
Text
="Button"
/>
<
asp:Label
ID
="Message"
runat
="server"
></
asp:Label
></
div
>
</
form
>
</
body
>
</
html
>
3、后台页面 NewsAdd.aspx.cs
using
System;
using
System.Data;
using
System.Configuration;
using
System.Collections;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
Mysqlserver;
using
System.IO;
using
System.Text;
namespace
NewsAdd
...
{ public partial class Admin_AdminPanel_NewsAdd : System.Web.UI.Page ... { protected void Page_Load( object sender, EventArgs e) ... { } protected void Button1_Click( object sender, EventArgs e) ... { string strDate = DateTime.Now.ToString( " yyMMdd " ) + " / " + DateTime.Now.ToString( " yyyymmddhhmmss " ); string strFileName = strDate + " .shtml " ; // 存储到数据库中 string strTitle = Request.Form[ " Title " ].ToString().Trim(); // 接收传过来的标题 string strContent = Request.Form[ " Content " ].ToString().Trim(); // 接收传过来的内容 string [] content = strContent.Split( new Char[] ... { ' | ' } ); // 对内容进行拆分,并保存到数组 int upbound = content.Length; // 数组的上限 SqlServerDataBase db = new SqlServerDataBase(); bool success = db.Insert( " insert into inNews(Title,Content,FilePath)values(' " + strTitle + " ',' " + strContent + " ',' " + strFileName + " ') " , null ); // if (success) // Message.Text = "添加成功!"; /**/ /// 创建当前日期的文件夹开始 string dir = Server.MapPath( " ../../ " + " NewsFiles/ " + DateTime.Now.ToString( " yyMMdd " )); // 用来生成文件夹 if ( ! Directory.Exists(dir)) ... { Directory.CreateDirectory(dir); } /**/ /// 创建当前日期的文件夹结束 try ... { for ( int i = 0 ; i < content.Length; i ++ ) ... { // string[] newContent = new string[4]; // 定义和html标记数目一致的数组 StringBuilder strhtml = new StringBuilder(); // 创建StreamReader对象 using (StreamReader sr = new StreamReader(Server.MapPath( " ../../ " + " NewsFiles/ " ) + " /template.html " ,Encoding.GetEncoding( " gb2312 " ))) ... { String oneline; // 读取指定的HTML文件模板 while ((oneline = sr.ReadLine()) != null ) ... { strhtml.Append(oneline); } sr.Close(); } // 为标记数组赋值 // SqlServerDataBase db = new SqlServerDataBase(); DataSet ds = db.Select( " select top 1 NewsId from inNews order by NewsId desc " , null ); // 获取id string strTable = " <table><tr><td>$upUrl</td><td>$Number</td><td>$downUrl</td></tr></table> " ; // 上下页表格,注意此处的$upUrl(上一页),$Number(页码分页),$downUrl(下一页) // 这三个是用来替换的。 string FilePath = "" ; strhtml = strhtml.Replace( " $Title " , strTitle); strhtml = strhtml.Replace( " $NewsId " , ds.Tables[ 0 ].Rows[ 0 ][ " NewsId " ].ToString()); strhtml = strhtml.Replace( " $Time " , DateTime.Now.ToString( " yyyy/MM/dd " )); strhtml = strhtml.Replace( " $Content " , content[i]); string strNumber = "" ; // 数字分页1,2,3…… for ( int m = 1 ; m <= upbound; m ++ ) ... { if (m == 1 ) // 如果是第一页就显示成这个样子:20070524.shtml而不是20070524_1.shtml strNumber = strNumber + " [ " + " <a href= " + " ../ " + strDate + " .shtml " + " > " + m + " </a> " + " ] " ; else ... { int n = m - 1 ; // 第三页的连接应该是20070524_2.shtml,以此类推 strNumber = strNumber + " [ " + " <a href= " + " ../ " + strDate + " _ " + n + " .shtml " + " > " + m + " </a> " + " ] " ; } } if (upbound == 0 ) // 如果没有分页,就直接按日期时间保存 ... { FilePath = Server.MapPath( " ../../ " ) + " NewsFiles " + " // " + strDate + " .shtml " ; strhtml = strhtml.Replace( " $Pager " , "" ); } else // 否则按20070524.shtml、20070524_1.shtml 这种效果保存 ... { if (i == 0 ) FilePath = Server.MapPath( " ../../ " ) + " NewsFiles " + " // " + strDate + " .shtml " ; else FilePath = Server.MapPath( " ../../ " ) + " NewsFiles " + " // " + strDate + " _ " + i + " .shtml " ; if (i == 0 ) // 第一页不显示上一页 strTable = strTable.Replace( " $upUrl " , "" ); if (i <= 1 ) // 上一页分页 strTable = strTable.Replace( " $upUrl " , " <a href= " + " ../ " + strDate + " .shtml " + " >上一页</a> " ); else ... { int p = i - 1 ; strTable = strTable.Replace( " $upUrl " , " <a href= " + " ../ " + strDate + " _ " + p + " .shtml " + " >上一页</a> " ); } if (upbound == 1 ) // 如果只有一页,则不显示页码 // strNumber=""; strTable = strTable.Replace( " $Number " , "" ); else strTable = strTable.Replace( " $Number " , strNumber); // 页码替换 /**/ if (i == upbound - 1 ) // 最后一页不显示下一页 strTable = strTable.Replace( " $downUrl " , "" ); if (i != upbound - 1 ) // 下一页分页 ... { int q = i + 1 ; strTable = strTable.Replace( " $downUrl " , " <a href= " + " ../ " + strDate + " _ " + q + " .shtml " + " >下一页</a> " ); } else ... { int j = upbound - 1 ; strTable = strTable.Replace( " $downUrl " , " <a href= " + " ../ " + strDate + " _ " + j + " .shtml " + " >下一页</a> " ); } strhtml = strhtml.Replace( " $Pager " , strTable); } // 创建文件信息对象-------------------------------------------- FileInfo finfo = new FileInfo(FilePath); // 以打开或者写入的形式创建文件流 using (FileStream fs = finfo.OpenWrite()) ... { // 根据上面创建的文件流创建写数据流 StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.Default); // 把新的内容写到创建的HTML页面中 sw.WriteLine(strhtml); sw.Flush(); sw.Close(); } } } catch (Exception err) ... { // 输出异常信息 Response.Write(err.ToString()); } } } }
请不要直接拷贝使用,里面的路径需要更改,但程序绝对没问题,在我本地已经测试通过。
另外在使用时,比如我要把新闻的内容分成4页,就应该这样写:111|222|333|444。