c#静态文件生成,续

来源:互联网 发布:软件开发工程师资格证 编辑:程序博客网 时间:2024/05/16 00:55

这里基本上和之前讲到的思路一致,同样是继承静态基类,StaticBase类,不过这个扩展类所实例化的参数有别,由于功能运用于分页,所以参数里考虑到总记录数和每页显示的记录数,这样就可以计算出总共有几页

page_count = (int)Math.Ceiling((float)records / pagesize);

这样我们的思路就可以通过循环页数来判断需要生成多少页了

同样这个页面也需要需要访问的数据源,模板类型,由于考虑到循环的数据列表多半是有格式的,所以参数引用一个需要循环访问的格式化的字符串和一个安顺序访问的数据库字段的的字符串数组,举例如下:

一般我们前台页面循环显示的列表格式如下:

<li><span>2010-5-26 9:44:06</span><a href="article_61.html" target="_blank>M影桌面互动价格推广月</a></li>

<li><span>2010-5-25 12:04:47</span><a href="article_54.html" target="_blank">酷乐岛无悠生活上线!</a></li>

<li><span>2010-4-29 12:32:12</span><a href="article_53.html" target="_blank">台北电玩展圆满成功!</a></li>

这样的数据格式中,日期和标题是从数据库中读取出来的,而也许用户还有很多的字段,那我们就把字符串参数传入分页类中,格式如下

 

<li><span>{0}</span><a href="article_{1}.html" target="_blank>{2}</a></li>,其中{0},{1},{2}分别为数据库中的字段“时间”,“标志列ID”,“标题”,这样就可以在通过传入的数据源参数循环赋值,如数据源是IEnumerable<DataRow> rowlist,一个datarow 的数组,则可以这样写入,

string s=string.Empty;

foreach(DataRow row in rowlist)

{

         s+=string.Format(<li><span>{0}</span><a href="article_{1}.html" target="_blank>{2}</a></li>, row["时间"],row["标识列id"],row["标题"]);

}

这样得出的就是需要替换模板静态文件中需要循环显示列表的地方的字符串,如$foreach$.

具体类的实现如下:

/// <summary>
        /// 写入页面数据流
        /// </summary>
        protected StreamWriter sw = null;
        /// <summary>
        /// 读取页面数据流
        /// </summary>
        protected StreamReader sr = null;
        /// <summary>
        /// 是否操作成功
        /// </summary>
        private bool o_sucess = true;
        /// <summary>
        /// 错误信息
        /// </summary>
        private string errorstring = string.Empty;
        /// <summary>
        /// 总页数
        /// </summary>
        private int page_count;
        /// <summary>
        /// 每页显示记录数
        /// </summary>
        private int page_size;
        /// <summary>
        /// 当前页数
        /// </summary>
        private int page_index = 1;
        /// <summary>
        /// 总记录数
        /// </summary>
        private int page_records;
        /// <summary>
        /// 数据源
        /// </summary>
        private IEnumerable<DataRow> rowlist;
        /// <summary>
        /// 模块类别
        /// </summary>
        private FlagsFileName fname;
        /// <summary>
        /// 按顺序替换的数据库字段
        /// </summary>
        private List<string> l_string;
        /// <summary>
        /// 重复循环的字符串格式
        /// </summary>
        private string each_string;
        /// <summary>
        /// 模板文件名称
        /// </summary>
        private string masterhtml;
        /// <summary>
        /// 是否分页
        /// </summary>
        private bool isPage;
        /// <summary>
        /// 构造器函数
        /// </summary>
        /// <param name="rlist">需要使用的数据源</param>
        /// <param name="fn">替换使用的模块</param>
        /// <param name="pagesize">每页显示的记录数</param>
        /// <param name="records">总记录数</param>
        /// <param name="lstring">安先后顺序需要从数据库中获取的字段列名</param>
        /// <param name="eachstring">需要循环显示的字符串格式,形式如"<li><span>{0}</span>----{1}</li>",其中{0},{1}就是对应于要替换的数据库中的字段列名</param>
        /// <param name="ispager">是否启动分页 </param>
        public ManyPage(DataRow[] rlist, FlagsFileName fn,int pagesize,int records,List<string> lstring,string eachstring,bool ispager)
        {
            this.rowlist = rlist;
            this.fname = fn;
            this.page_size = pagesize;
            this.page_records = records;
            this.masterhtml = FileName[fn] + ".html";
            this.page_count = (int)Math.Ceiling((float)records / pagesize);
            this.l_string = lstring;
            this.each_string = eachstring;
            this.isPage = ispager;
            WriteFile();
        }

        public override bool Osucess
        {
            get { return o_sucess; }
            set { o_sucess = value; }
        }
        public override string Errorstring
        {
            get { return errorstring; }
            set { errorstring = value; }
        }

        protected override bool WriteFile()
        {
            string str = "";
            try
            {
                #region 声明方法需要用到的变量
                List<object> olist = new List<object>();
                string reString = "";//用来替换的字符串
                string repageString = "";//用来替换的分页字符串
                IEnumerable<DataRow> rowArray;
                string detailString="";//替换后的字符串
                string savehtml = "";//要保存的文件名
                //支持需要框架的替换
                PointPage pg = new PointPage(new List<FlagsFileName>() { FlagsFileName.foot, FlagsFileName.head });
                #endregion

                sr = new StreamReader(HttpContext.Current.Server.MapPath(PagePath + this.masterhtml), code);
                str = sr.ReadToEnd();
                //如果启动分页
                if (this.isPage)
                {
                    for (int currentpage = 1; currentpage <= page_count; currentpage++)//每页递增
                    {
                        reString = "";      
                        repageString = "";
                        savehtml = FileName[fname] + "_" + currentpage + ".html";
                        rowArray = this.rowlist.Skip((currentpage - 1) * page_size).Take(page_size);
                        foreach (DataRow row in rowArray)
                        {
                            foreach (string s in l_string)
                            {
                                olist.Add(row[s].ToString());
                            }
                            reString += string.Format(each_string, olist.ToArray());
                            olist.Clear();
                        }

                        //如果启动分页
                        #region 开始写分页字符串
                        repageString += "<div class=/"/">/n记录数:" + page_records + " 总页数:" + page_count + "当前:第" + currentpage + "页 ";
                        if (currentpage != 1)
                        {
                            repageString += "<a href=/"" + FileName[fname] + "_" + (currentpage - 1) + ".html/">上一页</a>";
                        }
                        if (currentpage != page_count)
                        {
                            repageString += "<a href=/"" + FileName[fname] + "_" + (currentpage + 1) + ".html/">下一页</a>";
                        }
                        #endregion

                        detailString = str.Replace("$Foreach$", reString).Replace("$Pagelist$", repageString);
                        detailString = pg.WriteFile(detailString);

                        sw = new StreamWriter(HttpContext.Current.Server.MapPath(SavePath + savehtml), false, code);
                        sw.Write(detailString);
                        sw.Flush();
                    }
                }
                else
                {
                    savehtml = FileName[fname] + "_1.html";
                    rowArray = this.rowlist;
                    foreach (DataRow row in rowArray)
                    {
                        foreach (string s in l_string)
                        {
                            olist.Add(row[s].ToString());
                        }
                        reString += string.Format(each_string, olist.ToArray());
                        olist.Clear();
                    }
                    detailString = str.Replace("$Foreach$", reString).Replace("$Pagelist$", "");
                    detailString = pg.WriteFile(detailString);

                    sw = new StreamWriter(HttpContext.Current.Server.MapPath(SavePath + savehtml), false, code);
                    sw.Write(detailString);
                    sw.Flush();
                }
            }
            catch (Exception ex)
            {
                this.o_sucess = false;
                this.errorstring = ex.Message;
                return false;
            }
            return true;
        }

以上则是继承基础静态累的分页扩展类的源代码,测试已经能够通过,只是网页需要的就是将相应的参数的值传入正确,如模板的文件地址,数据源DataRow[]数组。已经静态模板文件中相应的要替换的字符串。好啦,说到这吧,一切尽在代码中。

原创粉丝点击