适用場景
先說一下僞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重寫,可不可以,我還沒有考慮好。
補充:
代碼編寫也是非常簡單的,和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;
}