2009-09-16 31 views
3

我有一個網格,需要能夠翻頁的聯繫信息。ASP.NET MVC分頁,保留當前查詢參數

所有的管道已經到位,最後一個細節。分頁是通過簡單的p Querystring參數完成的,例如, www.myurl.com/grid?p=3將是第三頁;存儲庫會自動獲取正確的數據以及項目的總數。每個頁面的大小定義在其他地方,我不需要擔心在查詢字符串中。

但是,我也支持搜索等。在我的查詢字符串中搜索的搜索詞表示爲q。所以現在我可以有一個組合:www.myurl.com/grid?q=tom & p = 2它搜索「湯姆」並拉第二頁的結果。

我現在面臨的,因爲Q(或其他)問題參數可以存在於查詢字符串,我怎麼創造這個尋呼機(這將需要保持的原始參數,因此,如果我點擊 「第2頁」,它需要從

  • www.myurl.com/grid?a=1&b=xyz&q=tom

  • www.myurl.com/grid?a=1&b=xyz&q=tom&p=2

我怎樣才能做到這一點?

回答

1

昨天我問了一個類似的問題。也許你想看看 Preserve data in .net mvc

以下是史蒂夫·桑德森的複製代碼book

public static class PagingHelpers 
{ 
    public static string PageLinks(this HtmlHelper html, int currentPage, 
    int totalPages, Func<int, string> pageUrl) 
    { 
     StringBuilder result = new StringBuilder(); 
     for (int i = 1; i <= totalPages; i++) 
     { 
      TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag 

      tag.MergeAttribute("href", pageUrl(i)); 
      tag.InnerHtml = i.ToString(); 
      if (i == currentPage) 
       tag.AddCssClass("selected"); 


      result.AppendLine(tag.ToString()); 
     } 
     return result.ToString(); 
    } 
} 
+0

您的問題與我的類似,但不一樣希望參數也保持可見(作爲整個查詢字符串的一部分,而不是隱藏字段),以便人們可以爲搜索查詢的第5頁添加書籤。 – Alex 2009-09-16 02:24:55

+0

我通過在Html.PageLink調用中添加了一些參數來體驗我的觀點。 <%= Html.PageLinks((int)的計算機[ 「當前頁」], (INT)計算機[ 「總頁數」], X => Url.Action(MVC.Merchandise.Actions.List, 新{類別=計算機[ 「CurrentCategory」], 頁= X, 價格= 3, 重量= 2}))%> 和我的結果URL從myurl /商品改變/ 5 到myurl /商品/ 5 /?價格= 3&weight = 2 這是你想要的嗎? – 2009-09-16 02:46:19

+0

如果你也想擁有page = 5,你應該去Global.ascx.cs並將你的路由映射從「Grid/{page}」更改爲「Grid」。 – 2009-09-16 02:49:36

0

所以,你需要在你的頁面的鏈接將用戶引導到相同的URL,但具有不同的「頁面」值。這樣做的最明顯的方法是讓代碼呈現頁面鏈接從當前請求中獲取查詢字符串,修改「頁面」值並使用修改後的字符串呈現鏈接。

或者,這是我採取的辦法,你可以定義你的「列表」頁面的新路線,包括任何分頁和排序值。這樣他們就是URL的一部分,但在控制器中也很容易處理。

,包括排序和分頁值可能看起來像這樣的例子:

 
routes.MapRoute(
    "List", 
    "{controller}/List/{pageNumber}/{sortBy}/{sortOrder}/{pageSize}", 
    new { action = "List", sortBy = "Id", sortOrder = "Asc", pageNumber = 1, pageSize = 10 }, 
    new { sortBy = @"[A-Za-z0-9+-]*", sortOrder = "Asc|Desc", pageNumber = @"\d{1,6}", pageSize = @"\d{1,6}" }); 

顯然你的「名單」的操作方法需要能夠解釋的值,並相應地處理數據。這可能不是你真正想要的,但我只是認爲我會把它扔到那裏。除此之外:我還寫了一個[List] action filter屬性,用於從路由中獲取這些值,並且(如果模型是集合)自動應用OnActionExecuted中的排序和分頁。這樣我所有的操作都是檢索數據並設置模型。

+0

你將如何創建一個適用於這種結構的尋呼機?你能發佈一個代碼示例嗎? – Alex 2009-09-16 04:06:19

+0

好吧,基本上,您現在擁有的信息都是相同的,但它們都可以在路由數據中使用,而不是查詢字符串。不過,我假設這種方法需要對代碼進行重大更改。 – 2009-09-16 09:33:38

0

我堅持會話中每個表單的搜索值。在響應搜索或分頁的方法中,我首先加載會話中的任何值,然後使用查詢字符串或表單參數中的值覆蓋它們(並根據需要設置會話值),具體取決於它是get還是post 。這樣我就不必擔心包括搜索標準的分頁代碼 - 它只是使用已存儲的內容。如果我想進行新的搜索,那麼搜索框中的值會發生變化,並使用過濾器按鈕執行搜索 - 從頁1結果開始。

+0

小心分享一些代碼可視化? – Alex 2009-09-16 02:57:45