2

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

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

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

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

    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 回答 2

2

您可以尝试我的解决方案将QueryStringField您的数据分页器的属性设置为查询字符串字段说页面。

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

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

将链接按钮放在您的列表视图中,这会将您重定向到详细信息页面,并在其点击事件中将当前页码保存在会话中

 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 页,数据分页器会自动将您带到该页码。

祝你好运 !

于 2012-01-25T20:04:04.367 回答
1

如果您没有任何过滤器,您可以简单地重新计算产品所在的页面。

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

另一种选择是通过 URL 将产品 ID 传递到列表页面。然后列表页面可以计算出合适的页面。这将消除 URL 中的噪音

于 2012-01-25T13:50:29.977 回答