C# 使用ListView/DataPager返回页面时记住分页

C# 使用ListView/DataPager返回页面时记住分页,c#,asp.net,datapager,C#,Asp.net,Datapager,我有一个简单的列表视图,由一个DataPager分页,给出产品列表。当我们点击产品时,我们会打开产品详细信息页面。在详细信息页面上,我们希望“返回产品列表”,但我们当然希望它记住datapager位于哪个页面 当然,这是一个自然的设计要求——简单的开箱即用的方法是什么 如果我们使用DataPager的QueryStringField属性,我们会在URL中获得页码,因此我希望可以在反向链接中使用referer URL,但我发现Request.urlreferer不可靠(例如,当我在Internet

我有一个简单的列表视图,由一个DataPager分页,给出产品列表。当我们点击产品时,我们会打开产品详细信息页面。在详细信息页面上,我们希望“返回产品列表”,但我们当然希望它记住datapager位于哪个页面

当然,这是一个自然的设计要求——简单的开箱即用的方法是什么

如果我们使用DataPager的QueryStringField属性,我们会在URL中获得页码,因此我希望可以在反向链接中使用referer URL,但我发现Request.urlreferer不可靠(例如,当我在Internet Explorer中使用F5调试应用程序时,Request.urlreferer始终为空)

我发现在会话变量中存储页码取得了一些成功:

    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为空时有效(因此可以检测到iPostBack)
  • 每个寻呼机都需要会话/cookie变量
  • 出现了如何重置会话/cookie变量的问题
  • 这样做的“正确”方式是什么


    谢谢

    如果您没有任何过滤器,只需重新计算产品所在的页面即可

    另一个选项是在产品详细信息页面的URL中对页面进行编码(以及列表的可能筛选值),并使用它们生成与原始列表基本相同的列表URL。甚至类似于用于登录的ReturnUrl方法。Sharepoint在其列表中也做了类似的事情,但我觉得URL可能会变得太乱(我并不是一个喜欢“干净的URL”废话的人,当我说它真的很乱的时候)

    还有一个选择是通过URL将产品ID传递到列表页面。然后,列表页面可以计算相应的页面。这将消除URL中的噪音

    您可以尝试我的解决方案 将datapager的
    QueryStringField
    属性设置为QueryStringField页面

     <asp:DataPager ID="DataPager2" runat="server" PagedControlID="ListView1" 
        QueryStringField="page">
        ....
    
    在“详细信息”页面上,检索该页面并作为查询字符串传回ListViewpage。 如果没有指定页码1,datapager会自动将您带到该页码


    祝你好运

    我明白你的意思-通过URL将所需数据传递到详细信息页面,然后再返回,但似乎我必须为每个场景自定义代码。我从一个每一分钟都手工编写细节代码的环境中走出来,一直期待着为我完成所有这些无聊的任务!我想您的第一个建议更合适,因为列表中的数据可能已更改,导致重新排序等,从而使存储的页面索引无效。您可以将此逻辑添加到BasePage类或其他内容中,这样您就不需要逐个处理它。我还为我的答案添加了另一个选项,我觉得这个选项在某种程度上更通用。实际上,你的最后一个选项是我如何理解你的第一个选项。这就是我决定实现它的方式——只需要从详细信息页面传递产品ID。从那里我可以精确地计算出要显示的页面,即使产品列表已经更改。您的解决方案消除了对iPostback和referrer url的依赖,并且我认为它消除了我在会话变量方面的问题—我们可以对每个页面使用相同的会话变量。此外,这也省去了我确定某个产品ID位于哪个页面的任务(并且产品列表更改的可能性很小)。我结合了您和Stillgar的建议:我使用了QueryStringField参数,但将页码传递到URL中的详细页面,而不是会话变量(这更方便)。我使用它来获取页码:PageNo=(int)Math.Truncate((double)(DataPager1.StartRowIndex/DataPager1.PageSize))+1;重要的是解决办法,如果奏效,那就是目标。谢谢
     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;