asp.net 页面静态化方案
在最近的用asp.net 开发的项目中,做优化,要把页面静态化,查了很多种方法,最后选择了用模板来实现,
最终页的实现比较简单,在网上找了一段代码,但首页,二级页,列表页的处理本人是用的以下方案,现在还只是一个比较简单的,希望有大家多多指点,交流;
方法如下:
思路描述:
1,在模板中自己写循环,通过asp.net 读入,再解析;
2,再按循环条件到数据库读取数据,用替换循环内的变量;
3,最后返回替换后的字符串,生成静态文件;
模板样式代码:
#foreach{News_Article;row_number() over(order by News_CreateTime desc) as rowNumber,News_Type,News_Title,News_HtmlFileName,News_Count;limit(0,1)|order(News_CreateTime desc)|types(in('0103'))|important(in('1'))|isnominate(1)|style(1)|define()}
<li>
<div class="sx">$News_Article.rowNumber</div>
<a href="$News_Article.News_HtmlFileName" target="_blank" title="$News_Article.News_Title;[点击数:$News_Article.News_Count]">$News_Article.News_Title</a>
</li>
#endforeach
列表页样式代码:
#foreach{News_Article;row_number() over(order by News_CreateTime desc) as rowNumber,News_Type,News_Title,News_HtmlFileName,News_Count;limit(0,1)|order(News_CreateTime desc)|types(not in ('0104'))|important(not in('0'))|isnominate(1)|style(1)|define();page(20)}
<li>
<div class="sx">$News_Article.rowNumber</div>
<a href="$News_Article.News_HtmlFileName" target="_blank" title="$News_Article.News_Title;[点击数:$News_Article.News_Count]">$News_Article.News_Title</a>
</li>
#endforeach
说明:#foreach #endforeach 这是自定义循环体,News_Article数据库表名,
row_number() over(order by News_CreateTime desc) as rowNumber,News_Type,News_Title,News_HtmlFileName,News_Count;显示字段名,
limit(0,1)|order(News_CreateTime desc)|types(in('0103'))|important(in('1'))|isnominate(1)|style(1)|define()条件
page(20)分页条数;
$News_Article.rowNumber循环体变量
处理方法:
/// <summary>
/// 生成文件
/// </summary>
/// <param name="str">模板文件内容</param>
/// <param name="strpath">当前程序服务器路径</param>
/// <returns></returns>
private Boolean BuildFile(string str,string strpath)
{
//取循环块
Regex regBKey = new Regex("#foreach([\\w\\W]*?)#endforeach");
//Regex regKey = new Regex("#foreach\\((.*?)\\)");
//Match m = regKey.Match(yourStr);
MatchCollection mc = regBKey.Matches(str);
foreach (Match m in mc)
{
if (m.Success)
{
//取循环参数
string processStr = m.Value;
Regex regSKey = new Regex("#foreach\\{(.*?)\\}");
Match PM = regSKey.Match(processStr);
if (PM.Success)
{
string parameterStr = PM.Value;
string loopStr = processStr.Replace(parameterStr, "").Replace("#endforeach", "");//得到循环字符串
//分析参数生成循环条件
//表名,字段,条件,排序,记录数
parameterStr = parameterStr.Replace("#foreach", "");
string[] ArrParam = parameterStr.Substring(1, parameterStr.Length - 1).Substring(0, parameterStr.Length - 2).Split(';');
//传入参数,循环字符串,返回结果字符串
if (ArrParam.Length == 3) //普通模块
{
//参数成功调用
string endLoopStr = GetRstLoopStr(ArrParam, loopStr);
//替换模块生成的字符串
str = str.Replace(processStr, endLoopStr);
}
else
{
if (ArrParam.Length == 4)
{
//列表页代分页
CreateListFile(ArrParam, loopStr, processStr, str);
return true ;
}
else
{
//失败
return false ;
}
}
}
}
}
string filePathName = strpath + _createHtmlFileName;
if (File.Exists(filePathName)) //删除旧文件
{
File.Delete(filePathName);
}
savefile(str, filePathName);
return true;
}
/// <summary>
/// 循环条件处理
/// </summary>
/// <param name="fileStrWhere"></param>
/// <returns></returns>
/// where(limit(),order(),types(),important(),isnominate(),style(),define())
/// #foreach{表名;字段;条件;}
private DataTable AnalyseLoopStr(string[] paramArr)
{
string tablename = paramArr[0].ToString();
string strfileds = paramArr[1].ToString();
string fileStrWhere = paramArr[2].ToString();
int start = 0;
int rowscout = 0;
string orderstr = "";
string tablekey = "";
DataTable dt = null;
try
{
//过滤条件处理
string[] paramWhere = fileStrWhere.Split('|');
StringBuilder strWhere = new StringBuilder();
foreach (string param in paramWhere)
{
string wherefilde = param.Substring(0, param.IndexOf('('));
string strValue = param.Substring(param.IndexOf('(')+1, param.LastIndexOf(')') - param.IndexOf('(')-1);
if (strValue != "")
{
switch (wherefilde)
{
case "limit":
string[] tmpArr = strValue.Split(',');
start = int.Parse(tmpArr[0].ToString());
rowscout = int.Parse(tmpArr[1].ToString());
if (tmpArr.Length > 2)
{
tablekey = tmpArr[2].ToString();
}
break;
case "types":
strWhere.Append(" And News_Type " + strValue);
break;
case "important":
strWhere.Append(" And News_Importance " + strValue);
break;
case "isnominate":
strWhere.Append(" And News_IsNominate=" + strValue);
break;
case "style":
strWhere.Append(" And News_Style='" + strValue + "' ");
break;
case "define":
strWhere.Append(" And " + strValue);
break;
case "order":
orderstr = strValue;
break;
}
}
}
dt = dal.GetDataTable(tablename, strWhere.ToString().Substring(strWhere.ToString().IndexOf("And")+3), strfileds, orderstr,tablekey,start,rowscout );
return dt; }
catch (Exception ex)
{
return null;
}
}