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

时间:2012-01-25 13:43:56

标签: c# asp.net datapager

我有一个由DataPager分页的简单ListView,它提供了一个产品列表。当我们点击产品时,我们打开产品详细信息页面。在详细信息页面上,我们希望“返回产品列表”,但我们当然希望它能够记住数据管理器所在的页面。

当然,这被认为是一种自然的设计要求 - 这种简单的开箱即用方式是什么?

如果我们使用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;
        }
    }

这种方法有一些缺点:

  1. 仅当QueryStringField为空(因此可以检测到IsPostBack)时才有效
  2. 每个寻呼机所需的会话/ cookie变量
  3. 如何重置会话/ cookie变量的问题出现
  4. 这样做的“正确”方法是什么?

    由于

2 个答案:

答案 0 :(得分:2)

您可以尝试我的解决方案 将数据槽的QueryStringField属性设置为querystringfield说明页。

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

注意:我将DataPager放在ListView之外。

将linkBut​​ton放入listview,将您重定向到detailspage,并在其click事件中将当前页码保存在Session

 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;

在详细信息页面上检索页面并作为查询字符串传回ListViewpage。 如果未指定为第1页,数据管理器将自动将您带到该页码。

祝你好运!

答案 1 :(得分:1)

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

另一个选项是在产品详细信息页面的URL中对页面进行编码(连同列表的可能过滤器值),并使用它们生成列表的URL,该列表的URL基本上与原始清单。甚至类似于用于登录的ReturnUrl方法。 Sharepoint与它的列表做了类似的事情,但我觉得URL太乱了(当我说它真的很混乱时,我不是一个整个“干净的URL”废话的人)

另一个选项是通过URL将产品ID传递到列表页面。然后列表页面可以计算适当的页面。这将消除网址中的噪音