自学了挺长时间的asp.net了,以前弄asp的,学.net的时候就看了一些资料,说怎样面向对象,什么“多态”,“继承”,“封装”。怎么学也感觉没什么收获。
 今天写了个长篇文章分页,大家给看看有什么缺陷,需要改正优化的地方啊?
抽象基类:public abstract class BaseContentPage
    {
      
        private string sign;
      
        private string optionContent;
       
       /// <summary>
       /// 分页标记
       /// </summary>
        protected string OptionContent
        {
            get { return optionContent; }
            set { optionContent = value; }
        }
       /// <summary>
       /// 操作内容
       /// </summary>
        protected string Sign
        {
            get { return sign; }
            set { sign = value; }
        }
       /// <summary>
       /// 基类构造函数
       /// </summary>
       /// <param name="Psign">分页符</param>
       /// <param name="PoptionContent">将要分页文章内容</param>
      
        public BaseContentPage(string Psign, string PoptionContent)
        {
            this.Sign = Psign;
            this.OptionContent = PoptionContent;            
        }
       /// <summary>
       /// 取得URL除page外的所有参数和值
       /// </summary>
       /// <returns></returns>
        protected string getUrlParame()
        {
            string returnParame = "";
            if (HttpContext.Current.Request.Url.Query.Length > 1)
            {
                string parameString = HttpContext.Current.Request.Url.Query.Substring(1);
                string[] parameArray = parameString.Split('&');
                foreach (string Para in parameArray)
                {
                    string[] signParame = Para.Split('=');
                    if (signParame[0] != "page")
                    {
                        returnParame += signParame[0] + "=" + signParame[1] + "&";
                    }                }
            }
            return returnParame;        }
        /// <summary>
        /// 基类中实现,
        /// </summary>
        /// <param name="PnowPage">当前页</param>
        /// <returns>返回页面链接</returns>
 
        public abstract string GetPageString(int PnowPage);
        /// <summary>
        /// 基类实现
        /// </summary>
        /// <param name="PnowPage">当前页</param>
        /// <returns>当前页对应的内容</returns>
        public abstract string GetPageContent(int PnowPage);
具体实现类public class ContentPage:BaseContentPage
    {
       private int totalPage = 0;
       public ContentPage(string Psign, string Pcontent)
         :base(Psign,Pcontent)
       { }       public ContentPage(string Pconetnt)
           : this("<--MKNEXTPAGE-->", Pconetnt)
       { }
       public override string GetPageString(int PnowPage)
        {
            StringBuilder pageString = new StringBuilder();
            pageString.Append("<div style=\"text-align:center; font-size:13px; font-weight:bold; color:#000\">");
            for (int i = 0; i < totalPage; i++)
            {
                if (PnowPage-1 == i)
                {
                    pageString.Append(string.Format("[{0}] ", i + 1));
                }
                else
                {
                    pageString.Append(string.Format("<a href=\"?{0}page={1}\">[{2}]</a> ", base.getUrlParame(), i + 1, i + 1));
                }
                
            }
            pageString.Append("</div>");            return pageString.ToString();
        }       public override string GetPageContent(int PnowPage)
        {
            string currContent = "";            if (base.OptionContent.IndexOf(base.Sign) < 0)
            {
                currContent = base.OptionContent;
            }
            else
            {
                string[] contentArray = Regex.Split(base.OptionContent, base.Sign);
                totalPage = contentArray.Length;
                if (PnowPage < 1)
                    PnowPage = 1;
                if (PnowPage > totalPage)
                    PnowPage = totalPage;                currContent = contentArray[PnowPage - 1];
            }
           
            return currContent;
        }
    }

解决方案 »

  1.   

    url参数中含有特殊字符&怎么处理?
      

  2.   

    可以在前面加转义符吧,如:@"csdn.net&uid=1"
      

  3.   

    这一些代码,都体现不出面对对象的,面向对象,最重的三个核心,封装”,“继承”,“封装”
    封装:就比如NET本身的封装类,这个就是很好的说明,可以做到代码重用,易维护。封装成类,谁都可以调用,修改,只要修改类而己
    继承,继承,可以很好说明面向对象的拓展性。
    楼主,你自己去体会吧,
      

  4.   

    别的不说,看你的这段代码:
            private string sign;
          
            private string optionContent;
           
           /// <summary>
           /// 分页标记
           /// </summary>
            protected string OptionContent
            {
                get { return optionContent; }
                set { optionContent = value; }
            }
           /// <summary>
           /// 操作内容
           /// </summary>
            protected string Sign
            {
                get { return sign; }
                set { sign = value; }
            }这两个受保护的属性有什么作用?
    只是为了给子类访问?
    那你大可以声明为受保护的字段。 /// <summary>
           /// 取得URL除page外的所有参数和值
           /// </summary>
           /// <returns></returns>
            protected string getUrlParame()这个方法好像asp.net 类库里已经提供。
      

  5.   

    感谢你的建议,呵呵。
    这两个受保护的属性有什么作用?
    一直写都是字段对应属性的,基类直接写字段就好了吗?
    protected string getUrlParame()
    我不知道asp.net 类库里是否提供搜了下好像没找到啊?
      

  6.   


    属性应该是public 的吧?如果不需要其他类访问设置属性 直接用私有字段就可以了吧
      

  7.   

    1)如果是C#3.0以后的版本,且属性只是简单的GetSet,请用自动属性
    2)命名不规范,要么Pascal规则要么Camel规则,推荐你C#用Pascal规则,你现在的代码是两者并存
    像 public BaseContentPage(string Psign, string PoptionContent)
    Pascal规则的函数名,但参数名不知你怎么想的,用的是首字母大写
    像 getUrlParame 又是Camel规则的函数名
    其他具体实现不做点评
      

  8.   

    我的一个分页代码:using System;
    using System.Collections;
    using System.Configuration;
    using System.Data;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Xml.Linq;
    using System.Data.SqlClient;
    using System.ComponentModel;
    using System.Text.RegularExpressions;
    using System.Web.UI.MobileControls;
    using System.Collections.Generic;
    using System.Text;
    using System.Diagnostics;
    using System.Collections.Specialized;namespace MyPager
    {
        public enum EConnectionType
        {
            SqlSourceID,
            ConnStr
        }
        public partial class VeryPage : System.Web.UI.UserControl
        {
            #region 必须设置的属性        /// <summary>
            /// 连接方式。
            /// </summary>
            public EConnectionType ConnectionType { get; set; }
            /// <summary>
            /// 连接字符串,该字符串指的是web.config中的connectionStrings节点。当不使用SqlSourceID的时候则必须指定,同时将引发事件传递DataSet。
            /// </summary>
            public string ConnStr { get; set; }
            /// <summary>
            /// 指定ConnectionType为ConnStr时,引发该事件,传递DataSet。
            /// </summary>
            public event ForConnStr ForConnStrEvent;        /// <summary>
            /// 数据源绑定控件。
            /// </summary>
            public string SqlSourceID { get; set; }
            /// <summary>
            /// 要查询的表名。
            /// </summary>
            public string TableName { get; set; }
            /// <summary>
            /// 翻页时的跳转页。
            /// </summary>
            public string PageName { get; set; }
            /// <summary>
            /// 排序字段。
            /// </summary>
            public string OrderField { get; set; }        #endregion        #region 一些属性        /// <summary>
            /// 需要移除的参数,默认将移除page
            /// </summary>
            public string[] RemoveKeys { get; set; }
            /// <summary>
            /// 每页显示数据量,默认为10。
            /// </summary>
            public int PageSize { get; set; }
            /// <summary>
            /// 总数。
            /// </summary>
            int Count { get; set; }
            /// <summary>
            /// 一共需要分多少页。
            /// </summary>
            int PageCount { get; set; }
            /// <summary>
            /// 当前页。
            /// </summary>
            int NowPage { get; set; }
            /// <summary>
            /// 需要查询的字段名,默认为“*”。
            /// </summary>
            public string FieldName { get; set; }
            /// <summary>
            /// 条件语句。
            /// </summary>
            public string Where { get; set; }
            /// <summary>
            /// 设置在只有一页的情况下是否显示分页。
            /// </summary>
            public bool OnePageVisible { get; set; }
            /// <summary>
            /// 设置排序。
            /// </summary>
            public string Order { get; set; }
            /// <summary>
            /// 指定ConnectionType为ConnStr时,将引发事件传递。
            /// </summary>
            DataSet ds;        public delegate void ForConnStr(DataSet ds);        #endregion        public VeryPage()
            {
                this.PreRender += new EventHandler(VeryPage_PreRender);
            }
            protected void Page_Load(object sender, EventArgs e)
            {        }
            void VeryPage_PreRender(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    PageSize = PageSize == 0 ? 10 : PageSize;
                    FieldName = FieldName != null ? FieldName : "*";
                    Order = Order != null ? Order : "desc";
                    Where = Where != null ? Where : "";
                    if (RemoveKeys == null)
                        RemoveKeys = new string[] { "page" };
                    //OnePageVisible = OnePageVisible != null ? OnePageVisible : false;
                    SqlConnection con;
                    SqlDataSource SqlSource = null;
                    if (ConnectionType == EConnectionType.SqlSourceID)
                    {
                        if (SqlSourceID == null)
                        {
                            pager.InnerHtml = "Error:使用的是SqlSourceID连接方式,但并没有指定SqlSourceID。";
                            return;
                        }
                        else
                        {
                            SqlSource = (SqlDataSource)Page.FindControl(SqlSourceID);
                            if (SqlSource != null)
                            {
                                con = new SqlConnection(SqlSource.ConnectionString);
                            }
                            else
                            {
                                pager.InnerHtml = "Error:使用的是SqlSourceID连接方式,但并没有找到SqlSourceID。";
                                return;
                            }
                        }
                    }
                    else
                    {
                        if (ConnStr == null)
                        {
                            pager.InnerHtml = "Error:使用的是ConnStr连接方式,但并没有指定ConnStr。";
                            return;
                        }
                        else
                        {
                            ConnStr = ConfigurationManager.ConnectionStrings[ConnStr].ConnectionString;
                            con = new SqlConnection(ConnStr);
                        }
                    }
                    try
                    {
                        con.Open();
                    }
                    catch
                    {
                        pager.InnerHtml = "Error:连接打开失败。";
                        return;
                    }
                    Count = GetCount(con, TableName, Where);
                    PageCount = GetPageCount(Count, PageSize);
                    NowPage = GetNowPage();
                    CreatePageLink(NowPage, PageCount, OnePageVisible);
                    //if (ConnectionType == EConnectionType.SqlSourceID)
                    //{
                    //    SetSelectCommand(SqlSource, TableName, FieldName, Where, Order);
                    //}
                    //else
                    //{
                    //    SetSelectCommand(con, TableName, FieldName, Where, Order,OrderField);
                    //    ForConnStrEvent(ds);
                    //}
                    SetSelectCommand(con, TableName, FieldName, Where, Order, OrderField);
                    ForConnStrEvent(ds);
                }
            }
            /// <summary>
            /// 返回一共有多少条数据。
            /// </summary>
            int GetCount(SqlConnection con, string TableName, string Where)
            {
                SqlCommand cmd = con.CreateCommand();
                cmd.CommandText = string.Format("select count(*) from {0} {1}", TableName, Where);
                int tempcount = (int)cmd.ExecuteScalar();
                con.Close();
                return tempcount;
            }
            /// <summary>
            /// 返回一共需要分多少页。
            /// </summary>
            int GetPageCount(int Count, int PageSize)
            {
                if (Count != 0)
                    PageSize = (int)Math.Ceiling((double)Count / PageSize);
                else
                    PageSize = 1;
                return PageSize;
            }
            /// <summary>
            /// 返回当前页。
            /// </summary>
            int GetNowPage()
            {
                string a = Request.QueryString["page"];
                int tempNowPage;
                if (Request.QueryString["page"] != null &&
                    Request.QueryString["page"] != "" &&
                    Regex.IsMatch(Request.QueryString["page"], @"^[+-]?\d*$") &&
                    int.Parse(Request.QueryString["page"]) <= PageCount)
                    tempNowPage = int.Parse(Request.QueryString["page"]);
                else
                    tempNowPage = 1;
                return tempNowPage;
            }
      

  9.   

     /// <summary>
            /// 创建分页连接。
            /// </summary>
            void CreatePageLink(int NowPage, int PageCount, bool OnePageVisible)
            {
                if (PageCount != 1 || (PageCount == 1 && OnePageVisible == true))
                {
                    //重组参数
                    NameValueCollection NewQueryString = new NameValueCollection(Request.QueryString);//将参数导出到一个新的容器
                    //移除不需要的参数
                    foreach (string key in RemoveKeys)
                    {
                        NewQueryString.Remove(key);
                    }
                    StringBuilder QS = new StringBuilder("");
                    foreach (string key in NewQueryString.AllKeys)
                    {
                        QS.Append("&" + key + "=" + NewQueryString[key]);
                    }
                    //
                    StringBuilder sb = new StringBuilder("");
                    sb.Append("<a href=\"" + PageName + "?page=1" + QS.ToString() + "\">最前页</a>\r\n");
                    int minpage = 1;
                    if (PageCount >= 10 && NowPage >= PageCount - 5)
                    {
                        minpage = NowPage - (4 + (NowPage - (PageCount - 5)));
                    }
                    else if (PageCount >= 10 && NowPage >= 5)
                    {
                        minpage = NowPage - 4;
                    }
                    if (PageCount >= 10)
                        PageCount = 10;
                    for (int i = 0; i < PageCount; i++)
                    {
                        if (minpage != NowPage)
                        {
                            sb.Append("<a href=\"" + PageName + "?page=" + minpage.ToString() + QS.ToString() + "\">" + minpage.ToString() + "</a>\r\n");
                        }
                        else
                        {
                            sb.Append("<a>" + NowPage.ToString() + "</a>\r\n");
                        }
                        minpage++;
                    }
                    sb.Append("<a href=\"" + PageName + "?page=" + PageCount + QS.ToString() + "\">最后页</a>&nbsp;&nbsp;共有:" + Count + "条\r\n");
                    pager.InnerHtml = sb.ToString();
                }
            }
            //void SetSelectCommand(SqlDataSource SqlSource, string TableName, string FieldName, string Where, string Order)
            //{
            //    string command;
            //    if (Order == "asc")//升序
            //    {
            //        command = string.Format("select top {0} {2} from (select top {1} {2} from {3} {4} order by {5} desc) as temptable order by {5} asc",
            //                                        PageSize.ToString(),
            //                                        Count - (NowPage - 1) * PageSize,
            //                                        FieldName,
            //                                        TableName,
            //                                        Where,
            //                                        Order);
            //    }
            //    else
            //    {
            //        //降序
            //        command = string.Format("select top {0} {2} from (select top {1} {2} from {3} {4} order by {5} asc) as temptable order by {5} desc",
            //                                        PageSize.ToString(),
            //                                        Count - (NowPage - 1) * PageSize,
            //                                        FieldName,
            //                                        TableName,
            //                                        Where,
            //                                        Order);
            //    }
            //    SqlSource.SelectCommand = command;
            //}
            void SetSelectCommand(SqlConnection con, string TableName, string FieldName, string Where, string Order, string OrderField)
            {
                string command = "";
                if (Order == "asc")
                {
                    //升序
                    command = string.Format("select top {0} * from (select top {1} {2} from {3} {4} order by {5} desc) as temptable order by {5} asc",
                        PageSize.ToString(),
                         Count - (NowPage - 1) * PageSize,
                         FieldName,
                         TableName,
                         Where,
                         OrderField);
                    //command = "exec('select top'+ @PageSize+' * from (select top'+ @PageSizeFZ + @FieldName+' from '+@TableName + @Where +'order by '+@OrderField'+ desc) as temptable order by '+@OrderField+' asc')";
                }
                else
                {
                    //降序
                    command = string.Format("select top {0} * from (select top {1} {2} from {3} {4} order by {5} asc) as temptable order by {5} desc",
                        PageSize.ToString(),
                         Count - (NowPage - 1) * PageSize,
                         FieldName,
                         TableName,
                         Where,
                         OrderField);
                    //command = "exec('select top'+ @PageSize+' * from (select top'+ @PageSizeFZ + @FieldName+' from '+@TableName + @Where +'order by '+@OrderField'+ asc) as temptable order by '+@OrderField+' desc')";            }
                //SqlCommand cmd = new SqlCommand(command, con);            //cmd.Parameters.Add("@PageSize", SqlDbType.Int).Value = PageSize.ToString();
                //cmd.Parameters.Add("@PageSizeFZ", SqlDbType.Int).Value = Count - (NowPage - 1) * PageSize;
                //cmd.Parameters.Add("@FieldName", SqlDbType.Int).Value = FieldName;
                //cmd.Parameters.Add("@TableName", SqlDbType.Int).Value = TableName;
                //cmd.Parameters.Add("@Where", SqlDbType.Int).Value = Where;
                //cmd.Parameters.Add("@OrderField", SqlDbType.Int).Value = OrderField;
                SqlDataAdapter da = new SqlDataAdapter(command, con);
                ds = new DataSet();
                da.Fill(ds);
            }
        }
    }