我有一个由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;
}
}
这种方法有一些缺点:
这样做的“正确”方法是什么?
由于
答案 0 :(得分:2)
您可以尝试我的解决方案
将数据槽的QueryStringField
属性设置为querystringfield说明页。
<asp:DataPager ID="DataPager2" runat="server" PagedControlID="ListView1"
QueryStringField="page">
....
注意:我将DataPager放在ListView之外。
将linkButton放入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传递到列表页面。然后列表页面可以计算适当的页面。这将消除网址中的噪音