asp.net 页面静态化方案

来源:互联网 发布:mac os x 10.12虚拟机 编辑:程序博客网 时间:2024/05/16 10:09

在最近的用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;
             }
         }