asp.net图文混排长新闻分页1

首先:分页是靠检索<p>标签实现的,所以后台发布新闻的时候最好用<p>标签分段。

其次:应该考虑到分页时不能截断html标签,否则,页面可能变的惨不忍睹,所以,程序要找到</p>标签,再在它后面分页。

最后:还要想到新闻的最后一页不能内容太少,比如用户辛苦点击了一个按钮,结果显示了一行新闻,是不是很搞笑,所以,要时刻判断新闻的长度。而且要注意新闻的分页数,不应太多,我这里设置的是最多9页。

以下代码是根据1000个字符分一页,基本思路是,程序检索到1000个字符处,然后从这开 始寻找离得最近的<p>标签,找到之后在其前面分页。同时还要判断剩余的没有分页的字符数,我设置的是如果剩余字符数少于1800就不需要在 分页了,防止最后一页内容过少。

private void BindNewContent() //获取新闻的方法

    {

        int id = Convert.ToInt32(Request.QueryString["id"]); //获取新闻id

        int newPageId=Convert.ToInt32(Request.QueryString["newPageId"]); //获取现在显示的是该新闻哪页

        DBClass db = new DBClass();

        string SelectStr =

            "select * from new where newId=@id";

        SqlCommand com = db.GetCommandStr(SelectStr);

        com.Parameters.Add("@id", SqlDbType.Int).Value = id;

        SqlDataReader sdr = db.ExecDataReader(com);

        if (sdr.Read())

        {

            //绑定新闻正文,并分页。

            string newMainText = sdr["newMainText"].ToString();

            newMainText = SetNewMainPage(newMainText, newPageId, id); //这里通过SetNewMainPage给新闻分页

            TitleLabel.Text = sdr["newTitle"].ToString();

            Page.Header.Title = "【" + sdr["newTitle"].ToString() + "】";

            SourceLabel.Text = sdr["newSource"].ToString();

            TimeLabel.Text = sdr["newTime"].ToString();

            SummaryLabel.Text = sdr["newSummary"].ToString();

            ContentLabel.Text = newMainText;

            //ContentLabel.Text = sdr["newMainText"].ToString();

            EditorLabel.Text ="责任编辑:"+ sdr["newEditor"].ToString();

        }

        else

        {

            Response.Write("<script>alert('您访问的页面不存在');window.close();</script>");

            Response.End();

            return;

        }

        sdr.Close();

    }

    private string SetNewMainPage(string newMainText, int newPageId,int id) //新闻分页的方法,newMainText是新闻正文字符串,newPageId表示当前为该新闻的哪一页,id表示新闻的id号。

    {

        string strContent = newMainText;

        ArrayList min =new ArrayList();

        string[] strNew = new string[10];

        int index = 0;

        while(!string.IsNullOrEmpty(strContent))

        {

            if(strContent.Length<=1800||index>=8) //为了防止新闻最后一页的过短也防止新闻分页过多,所以在此判断一下。

            {

                //Response.Write(index); return null;

                strNew[index]=strContent;

                break;

            }

            else

            {

                strNew[index]=strContent.Substring(0,strContent.IndexOf("<p",1000));

                strContent=strContent.Remove(0,strContent.IndexOf("<p",1000));

                index++;

            }

        }

        //下面的是为了前台显示新闻页面导航按钮能够居中,将其放到一个表格里。

        //增加包围新闻页面链接的层

        Table hrefDiv = new Table();

        TableRow row = new TableRow();

        TableCell cell = new TableCell();

        hrefDiv.Controls.Add(row);

        row.Controls.Add(cell);

        hrefDiv.Attributes.Add("class", "hrefDiv");

        NewPagePanel.Controls.Add(hrefDiv);

        for (int i = 0; i < strNew.Length; i++)

        {

            if (strNew[i] != null)

            {

                HyperLink HyperLink1 = new HyperLink();

                HyperLink1.ID = "HyperLink" + i;

                HyperLink1.NavigateUrl = "~/DetailedNew.aspx?id=" + id + "&newPageId=" + (i + 1);

                HyperLink1.Text = (i + 1).ToString();

                HyperLink1.Attributes.Add("class", "newHref");

                if (newPageId == (i + 1))

                {

                    HyperLink1.Attributes.Add("style", "background-color:#cc0000;color:#fff;border:2px #cc0000 solid;");

                }

                cell.Controls.Add(HyperLink1);

            }

            if (strNew[i] == null)

            {

                min.Add(i);

            }

        }

        //增加clear层,为了兼容css增加一个<div style="clear:both"/>层

        Panel clearDiv = new Panel();

        clearDiv.Attributes.Add("class", "clear");

        cell.Controls.Add(clearDiv);

        //防止用户通过更改地址栏而导航到本不存在的新闻页面

        if (newPageId >= (int.Parse(min[0].ToString()) + 1))

        {

            Response.Write("<script>alert('您访问的页面不存在');window.close();</script>");

            Response.End();

            return null;

        }

        if (int.Parse(min[0].ToString()) <= 1)

        {

            NewPagePanel.Visible = false;

        }

        return strNew[newPageId - 1].ToString();

    }

posted @ 2013-03-12 20:38  顶顶顶顶  阅读(145)  评论(0)    收藏  举报