C# 使用ListView/DataPager返回页面时记住分页
我有一个简单的列表视图,由一个DataPager分页,给出产品列表。当我们点击产品时,我们会打开产品详细信息页面。在详细信息页面上,我们希望“返回产品列表”,但我们当然希望它记住datapager位于哪个页面 当然,这是一个自然的设计要求——简单的开箱即用的方法是什么 如果我们使用DataPager的QueryStringField属性,我们会在URL中获得页码,因此我希望可以在反向链接中使用referer URL,但我发现Request.urlreferer不可靠(例如,当我在Internet Explorer中使用F5调试应用程序时,Request.urlreferer始终为空) 我发现在会话变量中存储页码取得了一些成功:C# 使用ListView/DataPager返回页面时记住分页,c#,asp.net,datapager,C#,Asp.net,Datapager,我有一个简单的列表视图,由一个DataPager分页,给出产品列表。当我们点击产品时,我们会打开产品详细信息页面。在详细信息页面上,我们希望“返回产品列表”,但我们当然希望它记住datapager位于哪个页面 当然,这是一个自然的设计要求——简单的开箱即用的方法是什么 如果我们使用DataPager的QueryStringField属性,我们会在URL中获得页码,因此我希望可以在反向链接中使用referer URL,但我发现Request.urlreferer不可靠(例如,当我在Internet
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;
}
}
这种方法有一些缺点:
谢谢如果您没有任何过滤器,只需重新计算产品所在的页面即可 另一个选项是在产品详细信息页面的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;