【自然框架】QuickPager分頁控制元件,新增一種分頁方式——偽URL分頁(Postback版)
適用場景
先說一下偽URL分頁的適用場景。在網站的網頁裡實現查詢功能,如果查詢條件比較少的話,還比較好辦,把查詢條件放到URL裡面傳遞即可。但是如果查詢條件過多,就會照成URL的長度過長。既不好看,編寫起來也很麻煩。如果查詢條件是漢字的話,還有一個編碼的問題。
Postback分頁
再看看現有的幾種分頁方式。Postback分頁方式可以利用ViewState來很方便的儲存查詢條件,但是由於採用表單提交的方式實現,搜尋引擎不能識別。這個對於網站來說,是一個很難接受的。
URL分頁
這個是通過URL裡的引數來分頁,搜尋引擎可以識別,而且還能使用URL重寫的方式。但是要保留查詢條件就比較麻煩了,一般是通過把查詢條件放到URL裡面來傳遞,但是編寫起來比較複雜。當然還有其他的方法來實現。
可能的方法
您可能會說,對於一般的不用查詢的分頁顯示資料的需求,可以URL分頁來實現。而對於需要查詢的需求,我們在換成Postback的分頁方式。
這個是可以的,但是也不太方便。
那麼能不能方便的把Postback分頁和URL分頁的優點結合起來呢?自然框架裡的QuickPager分頁控制元件新增了一種“偽URL分頁”的方式(不知道有沒有其他人也是實現了類似的方法)。這種新的方式結合了Postback分頁和URL分頁的優點。
偽URL分頁
看起來像URL分頁,當滑鼠放在“下一頁”(其他也類似)上面,會顯示xxx.aspx?page=3這類的資訊。但是實際上他是Postback的分頁。
偽URL分頁的連線方式:
<a href="PsotURL.aspx?page=7" onclick="javascript:__doPostBack('Pager1',7);return false;">下一頁</a>
Postback的連線方式:
<a href="javascript:__doPostBack('Pager1',2)">下一頁</a>
對比看一下就可以發現原理。其實也很簡單,postback是在href裡面呼叫js函式,而偽URL改成了在onclick裡面呼叫js函式,這樣herf就可以“節省”出來,我們“偽裝”一下,加上頁號的引數即可。然後在onclick裡面寫上return false,“禁用”herf。
您可能會問了,如果直接在位址列裡面輸入“PsotURL.aspx?page=7”會如何?當然是顯示第7頁的資料了(前提是有第七頁)。如果做不到這一點的話,也就無法“欺騙”搜尋引擎了。
另外偽URL分頁還可以保留URL裡面的引數,比如需要按照商品分類顯示資料,URL裡要有kind=3這樣的引數,那麼可以直接加在URL裡面,連線裡會自動加上kind=3的。
思維擴充套件
這種方式也可以變成偽URL分頁ajax版。就是說實質上用的ajax分頁,但是為了照顧搜尋引擎,可以加上一個連線給搜尋引擎看。至於URL重寫,可不可以,我還沒有考慮好。
線上演示:http://demo.naturefw.com/Nonline/QuickPager/default.aspx
原始碼和演示的程式碼 下載地址:http://www.naturefw.com/nature/down.aspx
補充:
程式碼編寫也是非常簡單的,和Postback分頁相比,只是多了一個屬性的設定,把Pager1.PagerTurnKind 這個屬性為PagerTurnKind.PostBackURL 。
其他的完全可以按照postback分頁的方式和習慣來做。
程式碼
/// <summary>
/// 偽URL分頁
/// </summary>
public partial class PsotURL : System.Web.UI.Page
{
#region 初始化
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
//資料訪問函式庫的例項
Pager1.DAL = Data.DALFactory.CreateDAL();
//設定顯示資料的控制元件
Pager1.ShowDataControl = this.GV;
//定義QuickPager_SQL,設定Page屬性
Pager1.PagerSQL.Page = this;
//設定成PostBackURL的分頁方式
this.Pager1.PagerTurnKind = PagerTurnKind.PostBackURL;
}
#endregion
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
SetPagerInfo(); //設定表名、欄位名等
}
}
#region 給QuickPager_SQL 設定屬性,以便拼接SQL
private void SetPagerInfo()
{
Pager1.PagerSQL.TableName = "Person_User_ViewLog"; //表名或者檢視名稱
Pager1.PagerSQL.TableShowColumns = "UserCode as 使用者,substring(IP,0,6) + '...' as IP ,訪問時間,URL as 訪問頁面"; //需要顯示的欄位
Pager1.PagerSQL.TablePKColumn = "LogID"; //主鍵名稱,不支援複合主鍵
Pager1.PagerSQL.TableOrderByColumns = "LogID desc "; //排序欄位,根據分頁演算法而定,可以支援多個排序欄位
Pager1.PagerSQL.TableQuery = ""; //查詢條件
Pager1.PageSize = 4; //一頁顯示的記錄數
Pager1.NaviCount = 8;
//設定分頁方式
Pager1.PagerSQL.SetPagerSQLKind = PagerSQLKind.Max_TopTop;
}
#endregion
}