自学了挺长时间的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;
}
}
今天写了个长篇文章分页,大家给看看有什么缺陷,需要改正优化的地方啊?
抽象基类: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;
}
}
解决方案 »
- 10个问题,每个问题10分
- PowerDesigner对应SQL Server里面的数据类型是什么啊
- Win7系统VS2008项目打包
- 怎样将contentplaceholder添加到table中
- 如何firefox使用javascript调用webserivces?搜索好多地方,没有找到答案!
- 请问datalist如何设置<EditItemTemplate >,并且更新数据库???
- 为什么看不见我画的图??
- mschart 当曲线条数Series太多时,图例太宽导致绘图区变小的问题
- 如何在ASP.NET中实现水晶报表参数传递
- 为什么.net的文档总是报应用程序错误?
- asp.net的一段javascript不执行 请指教
- 前台怎样确定页面加载完全?
封装:就比如NET本身的封装类,这个就是很好的说明,可以做到代码重用,易维护。封装成类,谁都可以调用,修改,只要修改类而己
继承,继承,可以很好说明面向对象的拓展性。
楼主,你自己去体会吧,
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 类库里已经提供。
这两个受保护的属性有什么作用?
一直写都是字段对应属性的,基类直接写字段就好了吗?
protected string getUrlParame()
我不知道asp.net 类库里是否提供搜了下好像没找到啊?
属性应该是public 的吧?如果不需要其他类访问设置属性 直接用私有字段就可以了吧
2)命名不规范,要么Pascal规则要么Camel规则,推荐你C#用Pascal规则,你现在的代码是两者并存
像 public BaseContentPage(string Psign, string PoptionContent)
Pascal规则的函数名,但参数名不知你怎么想的,用的是首字母大写
像 getUrlParame 又是Camel规则的函数名
其他具体实现不做点评
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;
}
/// 创建分页连接。
/// </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> 共有:" + 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);
}
}
}