這幾天在做國家教育平臺陽光工程,由于考慮到將來的用戶群比較多,所以我們考慮使用.net生成靜態頁面的方法來減少數據與數據庫的訪問量,雖然以前也寫過一些靜態的頁面,但是感覺沒有將來的比較復雜,所以搜索了一下網絡,再結合自己以前的一些經驗,總結出以下幾步思想:
1)做一個比較好的模板temp1.html,并在模板中寫好題目,內容,作者 以及發布日期的標記,如果還有其他列表的話也要寫好其他列表的標記,如 題目可以用標記:$Title$,內容可以用$cont$,發布日期$PubDate,最新發布新聞列表$DtNewest$;
2)設計數據庫,可以設置兩張表,一張表存放模板,一張用于存放發布新聞的內容
如 模板表: TempTable : ID ,classid,TempPath(存放模板的路徑);
新聞表: NesTable: ID,ClassID,title,cont,Filepath(發布后存放靜態頁面的路徑),pubdate,author,status;
3)添加新聞時,現在記錄添加到新聞表中,然后再根據欄目的ID找到該欄目的模板,把模板中的內容讀取到一個字符串變量中,并用新聞表中的字段替換模板中的相應標記,然后調用c#中的讀寫文件的類,寫到一個靜態文件中如:News.HTml,寫成功后再更新數據中靜態文件路徑filepath;
這樣一個靜態文件就寫好了
另外本人也從網絡上搜集了一些資料,供大家參考(關于新聞內容分頁的情況下次敘述)
一、類似的模板
模板頁Text.html代碼
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>$ShowArticle$</title>
<body>
$title$
<br>
$author$
<br>
$content$<br>
</body>
</HTML>
二、C#生成靜態頁類代碼|支持列表生成代碼
using System;
using System.Data;
using System.Configuration;
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 zj123.Model;
using System.IO;
using System.Text.RegularExPRessions;
using System.Runtime.InteropServices;
using System.Text;
using System.Collections;
namespace WebUI.html
{
public class EasyHtml
{
public bool MakeHtml(string artid)
{
bool succ = false;
int len = Convert.ToInt32(Convert.ToString(System.Configuration.ConfigurationManager.AppSettings["titlelength"]) ?? "20");
//讀取數據
string sql = string.Format("select a.*,b.ClassName,b.Depth,b.OrderBy,b.isTop,b.isList,b.IsLinks,b.Links,b.PicURL,b.ParentID,b.TemplateoutId,b.TemplateinNeiId,b.TemplateinListId from article a,zone b where a.classid=b.classid and a.Status=3 and a.articleid={0}", artid);
DataTable dt = DbHelperOleDb.Query(sql).Tables[0];
if(dt.Rows.Count>0)
{
//外模板
string waitemp = "";
DataTable waidt =DbHelperOleDb.Query(string.Format("select * from template where TemplateID={0}",Convert.ToString(dt.Rows[0]["TemplateoutId"]).Trim())).Tables[0];
if (waidt.Rows.Count > 0)
{
waitemp = Convert.ToString(waidt.Rows[0]["TemplateContent"]);
}
//內模板
string neitemp = "";
DataTable neidt = DbHelperOleDb.Query(string.Format("select * from template where TemplateID={0}", Convert.ToString(dt.Rows[0]["TemplateinNeiId"]).Trim())).Tables[0];
if (neidt.Rows.Count > 0)
{
neitemp = Convert.ToString(neidt.Rows[0]["TemplateContent"]);
}
//替換模板
waitemp = waitemp.Replace("$intemplate$", neitemp);
//替換類型
string tempclassname = classes.Common.GetP(Convert.ToString(dt.Rows[0]["classid"]));
waitemp = waitemp.Replace("$ClassName$", tempclassname);
#region "文章列表"
//最新的文章
System.Text.StringBuilder sbneartitle = new System.Text.StringBuilder("<div align=/"left/">");
DataTable nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 order by updatetime desc").Tables[0];
for (int i = 0; i < nearTitledt.Rows.Count; i++)
{
sbneartitle.AppendFormat("<li><a href=/"{0}/">{1}</a></li>",Convert.ToString(nearTitledt.Rows[i]["HtmlPath"]),Convert.ToString(nearTitledt.Rows[i]["Title"]));
}
sbneartitle.Append("</ol></div>");
waitemp = waitemp.Replace("$NearTitle$", sbneartitle.ToString());
sbneartitle.Remove(0,sbneartitle.ToString().Length);
if (waitemp.Contains("$OnTopTitle$"))
{
sbneartitle.Append("<div align=/"left/">");
//固定
nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 and OnTop=1 order by updatetime desc").Tables[0];
for (int i = 0; i < nearTitledt.Rows.Count; i++)
{
sbneartitle.AppendFormat("<li><a href=/"{0}/">{1}</a></li>", Convert.ToString(nearTitledt.Rows[i]["HtmlPath"]), Convert.ToString(nearTitledt.Rows[i]["Title"]));
}
sbneartitle.Remove(0, sbneartitle.ToString().Length);
sbneartitle.Append("</ol></div>");
waitemp = waitemp.Replace("$OnTopTitle$", sbneartitle.ToString());
sbneartitle.Remove(0, sbneartitle.ToString().Length);
}
if (waitemp.Contains("$HitsTitle$"))
{
sbneartitle.Append("<div align=/"left/">");
//熱門
nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 and Hits>1000 order by Hits desc,updatetime desc").Tables[0];
for (int i = 0; i < nearTitledt.Rows.Count; i++)
{
sbneartitle.AppendFormat("<li><a href=/"{0}/">{1}</a></li>", Convert.ToString(nearTitledt.Rows[i]["HtmlPath"]), Convert.ToString(nearTitledt.Rows[i]["Title"]));
}
sbneartitle.Append("</ol></div>");
waitemp = waitemp.Replace("$HitsTitle$", sbneartitle.ToString());
sbneartitle.Remove(0, sbneartitle.ToString().Length);
}
if (waitemp.Contains("$Elite$"))
{
sbneartitle.Append("<div align=/"left/">");
//推薦Elite
nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 and Elite=1 order by updatetime desc").Tables[0];
for (int i = 0; i < nearTitledt.Rows.Count; i++)
{
sbneartitle.AppendFormat("<li><a href=/"{0}/">{1}</a></li>", Convert.ToString(nearTitledt.Rows[i]["HtmlPath"]), Convert.ToString(nearTitledt.Rows[i]["Title"]));
}
sbneartitle.Append("</ol></div>");
waitemp = waitemp.Replace("$Elite$", sbneartitle.ToString());
sbneartitle.Remove(0, sbneartitle.ToString().Length);
}
//相關Classid
if (waitemp.Contains("$ClassTitle$"))
{
sbneartitle.Append("<div align=/"left/">");
nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 and classid=" + Convert.ToString(dt.Rows[0]["classid"]) + " order by updatetime desc").Tables[0];
for (int curr = 0; curr < nearTitledt.Rows.Count; curr++)
{
sbneartitle.AppendFormat("<li><a href=/"{0}/">{1}</a></li>", Convert.ToString(nearTitledt.Rows[curr]["HtmlPath"]), Convert.ToString(nearTitledt.Rows[curr]["Title"]));
}
sbneartitle.Append("</ol></div>");
waitemp = waitemp.Replace("$ClassTitle$", sbneartitle.ToString());
sbneartitle.Remove(0, sbneartitle.ToString().Length);
}
//相關Classid
if (waitemp.Contains("$LikeTitle$"))
{
sbneartitle.Append("<div align='left'>");
DataTable dtlike = zj123.Model.Article.GetLike(artid);
for (int likei = 0; likei < dtlike.Rows.Count; likei++)
{
sbneartitle.AppendFormat("<li><a href=/"{0}/">{1}</a></li>", Convert.ToString(dtlike.Rows[likei]["HtmlPath"]), Convert.ToString(dtlike.Rows[likei]["Title"]));
}
sbneartitle.Append("</ol></div>");
waitemp = waitemp.Replace("$LikeTitle$", sbneartitle.ToString());
sbneartitle.Remove(0, sbneartitle.ToString().Length);
}
/////////////////////////////////////////////////////////////////////////////////////////////
#endregion
//替換最新的數據
for (int j = 0; j < dt.Columns.Count; j++)
{
if (dt.Columns[j].ColumnName.Trim() == "Title")
{
string temp1 = "";
string temp2 = "";
string typefont = Convert.ToString(dt.Rows[0]["TitleFontType"]);
if (typefont == "0")
{
temp1 = "<strong>";
temp2 = "</strong>";
}
else if (typefont == "1")
{
temp1 = "<em>";
temp2 = "</em>";
}
else if (typefont == "2")
{
temp1 = "<strong><em>";
temp2 = "</strong></em>";
}
else
{
}
//System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex();
//Match match = Regex.Matches();
//reg.Replace(waitemp, Convert.ToString(dt.Rows[0][dt.Columns[j].ColumnName.Trim()]), 1, waitemp.IndexOf("$Title$"));
string temp11 = waitemp.Substring(0, waitemp.IndexOf("$Title$") + 8);
string temp22 = waitemp.Substring(waitemp.IndexOf("$Title$") + 8);
temp11 = temp11.Replace("$Title$", Convert.ToString(dt.Rows[0][dt.Columns[j].ColumnName.Trim()])+"---"+Regex.Replace(Regex.Replace(tempclassname,"<[^>]*>",""),"[>|<]*",""));
temp22 = temp22.Replace("$Title$", "<font color='" + Convert.ToString(dt.Rows[0]["TitleFontColor"]) + "'>" + temp1 + Convert.ToString(dt.Rows[0][dt.Columns[j].ColumnName.Trim()]) + temp2 + "</font>");
waitemp = temp11 + temp22;
temp11 = null;
temp22 = null;
//waitemp = waitemp.Replace("$" + dt.Columns[j].ColumnName.Trim() + "$", "<font color='" + Convert.ToString(dt.Rows[0]["TitleFontColor"]) + "'>" +temp1+ Convert.ToString(dt.Rows[0][dt.Columns[j].ColumnName.Trim()]) +temp2+ "</font>");
}
else if (dt.Columns[j].ColumnName.Trim().ToLower() == "hits")
{
waitemp = waitemp.Replace("$" + dt.Columns[j].ColumnName.Trim() + "$", Convert.ToInt16(dt.Rows[0][dt.Columns[j].ColumnName.Trim()]) > 1000 ? ("熱門") : (""));
}
else if (dt.Columns[j].ColumnName.Trim().ToLower() == "ontop")
{
waitemp = waitemp.Replace("$" + dt.Columns[j].ColumnName.Trim() + "$", Convert.ToString(dt.Rows[0][dt.Columns[j].ColumnName.Trim()]).ToLower() == "true" ? ("置頂") : (""));
}
else if (dt.Columns[j].ColumnName.Trim().ToLower() == "elite")
{
waitemp = waitemp.Replace("$" + dt.Columns[j].ColumnName.Trim() + "$", Convert.ToString(dt.Rows[0][dt.Columns[j].ColumnName.Trim()]).ToLower().ToString() == "true" ? ("推薦") : (""));
}
else
{
waitemp = waitemp.Replace("$" + dt.Columns[j].ColumnName.Trim() + "$", Convert.ToString(dt.Rows[0][dt.Columns[j].ColumnName.Trim()]));
}
}
//替換鏈表信息
//$typejs$
waitemp = waitemp.Replace("$typejs$", Convert.ToString(dt.Rows[0]["ClassID"]));
//$numjs$
waitemp = waitemp.Replace("$numjs$", "10");
//$setjs$
waitemp = waitemp.Replace("$setjs$","");
///js腳本信息
//根據路徑生成頁面
//路徑 檢查
string path = System.Web.HttpContext.Current.Request.PhysicalapplicationPath.Trim() + Convert.ToString(dt.Rows[0]["Links"]) + "http://" + Convert.ToDateTime(dt.Rows[0]["CreateTime"]).ToString("yyyy-MM");
if(!Directory.Exists(path))
Directory.CreateDirectory(path);
string filename = "http://"+ Convert.ToString(dt.Rows[0]["ArticleID"]) + ".html";
using(StreamWriter sw = new StreamWriter(path+"//"+filename,false,System.Text.Encoding.GetEncoding("gb2312")))
{
sw.Write(waitemp);
sw.Flush();
sw.Close();
}
//修改文章轉臺
try
{
if (artid == null)
return false;
int j = int.Parse(artid);
}
catch
{
return false;
}
string sql1 = string.Format("update article set iscreate=1,htmlpath='{0}' where articleid={1}", "/" + Convert.ToString(dt.Rows[0]["Links"]).Replace("////", "/") + "/" + Convert.ToDateTime(dt.Rows[0]["CreateTime"]).ToString("yyyy-MM") + filename, artid);
DbHelperOleDb.ExecuteSql(sql1);
}
else
{
return false;
}
return succ;
}
/// <summary>
/// 生成列表頁
/// </summary>
/// <param name="classid"></param>
/// <returns></returns>
public bool MakeList(string classid)
{
int len = Convert.ToInt32(Convert.ToString(System.Configuration.ConfigurationManager.AppSettings["titlelength"]) ?? "20");
bool succ = false;
try
{
int i = int.Parse(classid);
}
catch
{
return false;
}
DataTable dt = DbHelperOleDb.Query(string.Format("select a.*,b.ClassName,b.Depth,b.OrderBy,b.isTop,b.isList,b.IsLinks,b.Links,b.PicURL,b.ParentID,b.TemplateoutlistId,b.TemplateoutId,b.TemplateinNeiId,b.TemplateinListId,b.keyWords,b.[description] from article a,zone b where a.classid=b.classid and iscreate=1 and a.Status=3 and a.classid={0} order by a.UpdateTime desc,OnTop desc,Elite desc,Hits desc", classid)).Tables[0];
if (dt.Rows.Count > 0)
{
string classpath = HttpContext.Current.Request.PhysicalApplicationPath + @"/" + Convert.ToString(dt.Rows[0]["Links"]).Trim();
//讀取外模板信息
string templatewai = "";
DataTable templatewaidt = DbHelperOleDb.Query(string.Format("select * from template where TemplateID={0}", Convert.ToString(dt.Rows[0]["TemplateoutlistId"]))).Tables[0];
if (templatewaidt.Rows.Count > 0)
{
templatewai = Convert.ToString(templatewaidt.Rows[0]["TemplateContent"]);
}
//根據類型替換標題
string tempclassname = classes.Common.GetP(classid);
templatewai = templatewai.Replace("$Title$", Convert.ToString(dt.Rows[0]["ClassName"]).Trim() +"--"+Regex.Replace(Regex.Replace(tempclassname,"<[^>]*>",""),"[<|>]*",""));
templatewai = templatewai.Replace("$ClassTitleTop$", Convert.ToString(dt.Rows[0]["ClassName"]).Trim());
templatewai = templatewai.Replace("$ClassName$", tempclassname);
templatewai = templatewai.Replace("$Keyword$", Convert.ToString(dt.Rows[0]["Keywords"]).Trim());
templatewai = templatewai.Replace("$Description$", Convert.ToString(dt.Rows[0]["Description"]).Trim());
int zong = dt.Rows.Count;
int size = 10;
try
{
size = Convert.ToInt16(System.Configuration.ConfigurationManager.AppSettings["pagesize"]);
}
catch
{
size = 10;
}
int pagecount = zong % size == 0 ? (zong / 10) : (zong / 10 + 1);
string listcontent = "";
DataTable dtlist = DbHelperOleDb.Query(string.Format("select * from template where TemplateID={0}", Convert.ToString(dt.Rows[0]["TemplateinListId"]))).Tables[0];
if (dtlist.Rows.Count > 0)
{
listcontent = Convert.ToString(dtlist.Rows[0]["TemplateContent"]);
}
//// Match mat = Regex.Match(this.rtbconten.Text.Trim(), "<tablehead>(?<content>.*)<tableheadend><tablebody></tablebodyend><tablepage></tablepage><tablebottom></tablebottomend>", RegexOptions.Multiline | RegexOptions.IgnoreCase);
//// MessageBox.Show(mat.Groups["content"].Value);
////<tablehead>(?<content>.*)<tableheadend><tablebody></tablebodyend><tablepage></tablepage><tablebottom></tablebottomend>
////
Match mat = Regex.Match(listcontent, "<tablehead>(?<head>.*)<tableheadend><tablebody>(?<body>.*)</tablebodyend><tablepage>(?<page>.*)</tablepage><tablebottom>(?<bottom>.*)</tablebottomend>",RegexOptions.IgnoreCase|RegexOptions.Multiline);
string head = Convert.ToString(mat.Groups["head"]);
string body = Convert.ToString(mat.Groups["body"]);
string page = Convert.ToString(mat.Groups["page"]);
string bottom = Convert.ToString(mat.Groups["bottom"]);
//循環生成分頁
for (int i = 0; i < pagecount; i++)
{
//System.Text.StringBuilder sbneilist = new System.Text.StringBuilder("<TABLE cellSpacing=0 cellPadding=0 width=760 border=0><TBODY>");
System.Text.StringBuilder sbneilist = new System.Text.StringBuilder(head);
int l = 0;
for (int j = (i * size < zong) ? (i * size) : (zong); j < ((i + 1) * size < zong ? ((i + 1) * size) : (zong)); j++)
{
//sbneilist.Append(" <TR><TD vAlign=top align=center bgColor=#f7f7f7 >");
//string temp = listcontent;
string temp = body;
for (int k = 0; k < dt.Columns.Count; k++)
{
temp = temp.Replace("$" + dt.Columns[k].ColumnName.Trim() + "$", Convert.ToString(dt.Rows[j][dt.Columns[k].ColumnName.Trim()]));
}
if ((++l) % 5 == 0)
{
sbneilist.Append(temp).Append("<dd class=/"l/"></dd>");
}
else
{
sbneilist.Append(temp);
}
//sbneilist.Append("</td></tr>");
}
//sbneilist.Append("<TR><TD height=36>").Append(classes.Common.GetPage(i + 1, size, zong)).Append("</td></tr>");
sbneilist.Append(page.Replace("¥pages¥", classes.Common.GetPage(i + 1, size, zong)));
// sbneilist.Append("</tbody></table>");
sbneilist.Append(bottom);
#region "文章列表"
//最新的文章
System.Text.StringBuilder sbneartitle = new System.Text.StringBuilder("");
DataTable nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 order by updatetime desc").Tables[0];
for (int curr = 0; curr < nearTitledt.Rows.Count; curr++)
{
sbneartitle.AppendFormat("<li>·<a href=/"{0}/">{1}</a></li>", Convert.ToString(nearTitledt.Rows[curr]["HtmlPath"]), Convert.ToString(nearTitledt.Rows[curr]["Title"]));
}
sbneartitle.Append("");
templatewai = templatewai.Replace("$NearTitle$", sbneartitle.ToString());
sbneartitle.Remove(0, sbneartitle.ToString().Length);
sbneartitle.Append("");
//固定
nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 and OnTop=1 order by updatetime desc").Tables[0];
for (int curr = 0; curr < nearTitledt.Rows.Count; curr++)
{
sbneartitle.AppendFormat("<li>·<a href=/"{0}/">{1}</a></li>", Convert.ToString(nearTitledt.Rows[curr]["HtmlPath"]), Convert.ToString(nearTitledt.Rows[curr]["Title"]));
}
sbneartitle.Remove(0, sbneartitle.ToString().Length);
sbneartitle.Append("");
templatewai = templatewai.Replace("$OnTopTitle$", sbneartitle.ToString());
sbneartitle.Remove(0, sbneartitle.ToString().Length);
sbneartitle.Append("");
//熱門
nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 and Hits>1000 order by Hits desc,updatetime desc").Tables[0];
for (int curr = 0; curr < nearTitledt.Rows.Count; curr++)
{
sbneartitle.AppendFormat("<li>·<a href=/"{0}/">{1}</a></li>", Convert.ToString(nearTitledt.Rows[curr]["HtmlPath"]), Convert.ToString(nearTitledt.Rows[curr]["Title"]));
}
sbneartitle.Append("");
templatewai = templatewai.Replace("$HitsTitle$", sbneartitle.ToString());
sbneartitle.Remove(0, sbneartitle.ToString().Length);
sbneartitle.Append("");
//推薦Elite
nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 and Elite=1 order by updatetime desc").Tables[0];
for (int curr = 0; curr < nearTitledt.Rows.Count; curr++)
{
sbneartitle.AppendFormat("<li>·<a href=/"{0}/">{1}</a></li>", Convert.ToString(nearTitledt.Rows[curr]["HtmlPath"]), Convert.ToString(nearTitledt.Rows[curr]["Title"]));
}
sbneartitle.Remove(0, sbneartitle.ToString().Length);
sbneartitle.Append("");
templatewai = templatewai.Replace("$Elite$", sbneartitle.ToString());
sbneartitle.Append("");
//相關Classid
nearTitledt = DbHelperOleDb.Query("select top 10 case when len(title)>" + len + " then substring(title,1," + len + ") else title end as Title,HtmlPath from article where iscreate=1 and classid=" + classid + " order by updatetime desc").Tables[0];
for (int curr = 0; curr < nearTitledt.Rows.Count; curr++)
{
sbneartitle.AppendFormat("<li>·<a href=/"{0}/">{1}</a></li>", Convert.ToString(nearTitledt.Rows[curr]["HtmlPath"]), Convert.ToString(nearTitledt.Rows[curr]["Title"]));
}
sbneartitle.Append("");
templatewai = templatewai.Replace("$ClassTitle$", sbneartitle.ToString());
sbneartitle.Remove(0, sbneartitle.ToString().Length);
//sbneartitle.Append("<div align='left'>");
//DataTable dtlike = zj123.Model.Article.GetLike(artid);
//for (int likei = 0; likei < dtlike.Rows.Count; likei++)
//{
// sbneartitle.AppendFormat("<li><a href=/"{0}/">{1}</a></li>", Convert.ToString(dtlike.Rows[likei]["HtmlPath"]), Convert.ToString(dtlike.Rows[likei]["Title"]));
//}
//sbneartitle.Append("</ol></div>");
//waitemp = waitemp.Replace("$LikeTitle$", sbneartitle.ToString());
//sbneartitle.Remove(0, sbneartitle.ToString().Length);
/////////////////////////////////////////////////////////////////////////////////////////////
#endregion
//替換鏈表信息
//$typejs$
templatewai = templatewai.Replace("$typejs$", classid);
//$numjs$
templatewai = templatewai.Replace("$numjs$", "10");
//$setjs$
templatewai = templatewai.Replace("$setjs$", "");
string tempzong = templatewai.Replace("$intemplate$", sbneilist.ToString());
string indexshow = (i + 1).ToString() == "1" ? ("") : ((i + 1).ToString());
新聞熱點
疑難解答