2012-01-25 21 views
2

DataPagerでページングされた単純なListViewには、製品のリストがあります。製品をクリックすると、製品の詳細ページが開きます。詳細ページでは、「製品リストに戻る」ことを望んでいますが、データページャがどのページにあったのかを覚えておきたいと思います。ListView/DataPagerを使用してページに戻るときのページングを記憶する

確かにこれは自然な設計要件として考えられました。これを行うための簡単な方法は何ですか?

DataPagerのQueryStringFieldプロパティを使用すると、URLのページ番号が取得されるので、私は後者のリンクでリファラーURLを使用できますが、Request.UrlReferrerが信頼できないことがわかりました(F5たとえばInternet Explorerでアプリケーションをデバッグするには、Request.UrlReferrerは常にnullです)。

私はセッション変数にページ番号を記憶して、いくつかの成功を発見した

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      if (Session["PagerIndex"] != null) 
      { 
       DataPager1.SetPageProperties((int)Session["PagerIndex"], 
        DataPager1.MaximumRows, false); 
      } 
     } 
    } 

    protected void DataPager1_PreRender(object sender, EventArgs e) 
    { 
     if (Page.IsPostBack) 
     { 
      Session["PagerIndex"] = DataPager1.StartRowIndex; 
     } 
    } 

この方法は、いくつかの欠点がありますQueryStringFieldが空白の場合

  1. のみ動作します(そうIsPostBackプロパティを検出することができます)
  2. 各ページャーでセッション/ Cookie変数が必要です
  3. セッション/ Cookie変数をリセットする方法の問題

これを行うには「適切な」方法は何ですか?

おかげ

答えて

1

あなたはどのフィルタを持っていない場合は、単に製品があった上でページを再計算することができます。

もう1つの選択肢は、製品の詳細ページのURLにページをエンコードし(リストの可能なフィルタ値と共に)、それらを使用して、リストのURLを生成します。元のリストReturnUrlのようなものでもログインに使用されます。 Sharepointはリストと似たようなことをしますが、私はURLがあまりにも厄介になることがあると感じています(そして、私はそれが本当に面倒であると言うと全体の「クリーンURL」の間違いがありません)

もう1つのオプション製品IDをURL経由でリストページに渡すことです。リストページは、適切なページを計算することができます。これは、あなたがページを言うquerystringfieldにごdatapagerのQueryStringFieldプロパティを設定し 私の解決策を試すことができたURL

+0

URLを介して必要なデータを詳細ページに渡して戻しますが、すべてのシナリオでカスタムコードを作成する必要があるようです。私は毎分細部を手渡している環境から移動しています。これらのすべての不機嫌な作業が私のために行われることを楽しみにしていました!あなたの最初の提案は、リスト内のデータが変更されて再注文などにつながり、保存されたページインデックスが無効になる可能性があるため、より適切であると思います。 – Etherman

+0

このロジックをBasePageクラスなどに追加して、ケースバイケースで処理する必要はありません。私は私の答えにもう一つの選択肢を追加しました。 – Stilgar

+0

実際にあなたの最後の選択肢は、私があなたの最初のものを理解した方法です。これはどのように私はそれを実装することを決めた - 製品IDだけ詳細ページから渡す必要があります。そこから、たとえ製品リストが変更されたとしても、表示するページは正確に分かります。 – Etherman

2

からノイズを除去します。

<asp:DataPager ID="DataPager2" runat="server" PagedControlID="ListView1" 
    QueryStringField="page"> 
    .... 

注:DataPagerをListViewの外部に配置しました。 detailspageにリダイレクトし、そのクリックイベント内のページを検索しListViewpageへのクエリ文字列としてバックパスのセッションで詳細ページで

int integ; 
    decimal fract; 
    integ = DataPager2.StartRowIndex/DataPager2.PageSize; 
    fract = (DataPager2.StartRowIndex/DataPager2.PageSize) - integ; 
    if (fract > 0) 
     page = integ; 
    else if (integ > 0) page = integ - 1; 
    Session["page"]=page; 

を現在のページ番号が保存されますあなたのリストビューにLinkBut​​tonコントロールを入れ

。 ページ番号1に指定されていない場合、自動的にデータページャがそのページ番号に移動します。

幸運に分け!

+0

あなたのソリューションは、IsPostBackとreferrer urlへの依存をなくし、私はセッション変数で問題を取り除いたと思います。すべてのページャーで同じセッション変数を使用できます。また、特定の製品IDがどのページにあるかを把握する手間を省くことができます(また、製品リストの変更の可能性も最小限に抑えられます)。 – Etherman

+0

私はあなたとStilgarの提案を組み合わせて使用​​しました。私はQueryStringFieldパラメータを使用しましたが、セッション変数の代わりにURLの詳細ページにページ番号を渡しました(これはより便利でした)。私はページ番号を取得するためにこれを使いました:PageNo =(int)Math.Truncate((double)(DataPager1.StartRowIndex/DataPager1.PageSize)))+ 1; – Etherman

+0

問題が解決したら、それは目標だった。ありがとう – Mubarek

関連する問題