关于HTML静态页面(含自动分页)生成的可行性方案
- using System.IO;
- using System.Text;
- using System.Net;
接下来要设定附件上传的位置设定了
- //文章默认存放的绝对路径
- private string FilePageDir = System.Web.HttpContext.Current.Server.MapPath(ConfigurationManager.AppSettings[“NewsFiles”]);
下面是生成文件的主体了,主要是生成时候的内容以及分割几块
- #region 生成批量新闻数据
- /// <summary>
- /// 生成批量新闻数据
- /// </summary>
- /// <param name=”getData”></param>
- public void FilePageForCreate(Hashtable getData)
- {
- string strDate = getData[“pStrDate”].ToString();//目录
- string strFileName = getData[“pStaticPageName”].ToString();//目录及文件名
- string strTitle = getData[“pTitle”].ToString();//标题
- string strContent = getData[“pContent”].ToString();//内容
- string strNewsSortID = getData[“pNewsSortID”].ToString();//分类ID
- string strCreateTime = getData[“pCreateTime”].ToString();//创建时间
- string strCreateUserName = getData[“pCreateUserName”].ToString();//发布人
- string strNewsFrom = getData[“pNewsFrom”].ToString();//来源
- string strLink = getData[“pLink”].ToString();//链接
- string strCreateUserID = getData[“pCreateUserID”].ToString();//创建人ID
- string strAssistantTitle = getData[“pAssistantTitle”].ToString();//副标题
- string strHit = getData[“pHit”].ToString();//点击数量
- string strKeyword = getData[“pKeyword”].ToString();//关键字
- string strNewsID = getData[“pNewsID”].ToString();//新闻ID
- string strHtmlHeader = getData[“pHtmlHeader”].ToString();//表头
- string strNewsSortName = getData[“pNewsSortName”].ToString();//分类名
- strContent = strContent.Replace(“$$分页$$”, “|”);
- string[] content = strContent.Split(new Char[] { | });//对内容进行拆分,并保存到数组
- int upbound = content.Length;//数组的上限
- ///////////////////////////创建当前日期的文件夹开始
- string dir = FilePageDir + 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 = GetFileCode(FilePageDir + “\\NewsDetailTemplate.html”);//读取模板
- //为标记数组赋值
- string strTable = “<table><tr><td style=\”font-size:12px\”>$upUrl</td><td style=\”font-size:14px\”>$Number</td><td style=\”font-size:12px\”>$downUrl</td></tr></table>”;//上下页表格,注意此处的$upUrl(上一页),$Number(页码分页),$downUrl(下一页)
- //这三个是用来替换的。
- string filePath = “”;
- strhtml = strhtml.Replace(“$NewsSortName”, strNewsSortName);
- strhtml = strhtml.Replace(“$HtmlHeader”, strHtmlHeader);
- strhtml = strhtml.Replace(“$NewsSortID”, strNewsSortID);
- strhtml = strhtml.Replace(“$CreateUserName”, strCreateUserName);
- strhtml = strhtml.Replace(“$NewsFrom”, strNewsFrom);
- strhtml = strhtml.Replace(“$Link”, strLink);
- strhtml = strhtml.Replace(“$CreateUserID”, strCreateUserID);
- strhtml = strhtml.Replace(“$AssistantTitle”, strAssistantTitle);
- strhtml = strhtml.Replace(“$Hit”, strHit);
- strhtml = strhtml.Replace(“$Keyword”, strKeyword);
- strhtml = strhtml.Replace(“$Title”, strTitle);
- strhtml = strhtml.Replace(“$NewsId”, strNewsID);
- strhtml = strhtml.Replace(“$CreateTime”, 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.html而不是20070524_1.html
- strNumber = strNumber + ” [“ + “<a href=” + “../” + strDate + “.html” + “>” + m + “</a>” + “] “;
- else
- {
- int n = m – 1;//第三页的连接应该是20070524_2.html,以此类推
- strNumber = strNumber + ” [“ + “<a href=” + “../” + strDate + “_” + n + “.html” + “>” + m + “</a>” + “] “;
- }
- }
- if (upbound == 0)//如果没有分页,就直接按日期时间保存
- {
- filePath = FilePageDir + “//” + strDate + “.html”;
- strhtml = strhtml.Replace(“$Pager”, “”);
- }
- else//否则按20070524.html、20070524_1.html 这种效果保存
- {
- strNumber = strNumber.Replace(“>” + (i + 1) + “<“, “><u><b>” + (i + 1) + “</b></u><“);
- if (i == 0)
- filePath = FilePageDir + “//” + strDate + “.html”;
- else
- filePath = FilePageDir + “//” + strDate + “_” + i + “.html”;
- if (i == 0)//第一页不显示上一页
- strTable = strTable.Replace(“$upUrl”, “”);
- if (i <= 1)//上一页分页
- strTable = strTable.Replace(“$upUrl”, “<a href=” + “../” + strDate + “.html” + “>上一页</a>”);
- else
- {
- int p = i – 1;
- strTable = strTable.Replace(“$upUrl”, “<a href=” + “../” + strDate + “_” + p + “.html” + “>上一页</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 + “.html” + “>下一页</a>”);
- }
- else
- {
- int j = upbound – 1;
- strTable = strTable.Replace(“$downUrl”, “<a href=” + “../” + strDate + “_” + j + “.html” + “>下一页</a>”);
- }
- strhtml = strhtml.Replace(“$Pager”, strTable);
- }
- RunFilesBuild(strhtml,filePath);//生成页面
- }
- }
- catch (Exception ex)
- {
- //输出异常信息
- // Response.Write(err.ToString());
- ITNB.Base.Error.showError(ex.Message.ToString());
- }
- }
- #endregion
最后当然是文件输出的方法了,这个相对来说比较的简单点了,大陆通用的方法
- #region 生成文件
- /// <summary>
- /// 生成文件
- /// </summary>
- /// <param name=”strhtml”>数据内容</param>
- /// <param name=”filePath”>路径</param>
- public void RunFilesBuild(StringBuilder strhtml, string filePath)
- {
- //创建文件信息对象——————————————–
- 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();
- }
- }
- #endregion
一点建议:
生成文件最好是SHTML的,当然这个前提是要服务器允许且支持SSI,至于如何做网上有很多的教程的,自己去搜索一下吧,来说说好处吧:
shtml和asp 有一些相似,以shtml命名的文件里,使用了ssi的一些指令,就像asp中的指令,你可以在SHTML文件中写入SSI指令,当客户端访问这些shtml文件时,服务器端会把这些SHTML文件进行读取和解释,把SHTML文件中包含的SSI指令解释出来
换句话说:就是可以使用一些类似ASP的特性的功能,例如文件包含,文件调用等!
目前,主要有以下几种用用途:
1、显示服务器端环境变量<#echo>
2、将文本内容直接插入到文档中<#include>
3、显示WEB文档相关信息<#flastmod #fsize> (如文件制作日期/大小等)
4、直接执行服务器上的各种程序<#exec>(如CGI或其他可执行程序)
5、设置SSI信息显示格式<#config>(如文件制作日期/大小显示方式) 高级SSI<XSSI>可设置变量使用if条件语句。
例子:<!–#include file=”info.htm”–>
具体如何做,关于这方面的资料网上随便搜罗都一堆,就不详细说明了!