在.net问题中,返回列表上一个下一个控件

本文关键字:列表 上一个 下一个 控件 返回 net 问题 | 更新日期: 2023-09-27 18:03:14

我需要帮助,因为我没有找到我使用MVVM的项目的解决方案。一方面我有一个默认值。它包含一个带有两个用户控件的UpdatePanel。第一个控件是一个FilterControl,其中包含一些要过滤的字段。第二个控件是GridView,当我按下FilterControl中的按钮搜索时,它允许分页并从数据库中填充数据。假设查询返回100条记录。如果我将PageSize设置为20个结果那么GridView中就有5个页面?

另一方面,我有一个带有FormView的Details页面,该页面从GridView接收项目的Id参数并显示有关该项目的信息。就在asp:FormView代码之上,我有另一个用户控件,通过相应的ViewModel从会话变量中的gridview中过滤数据,并计算哪些项目应该是下一个和上一个,所以我有一个"返回列表"链接和"上一个"answers"下一个"链接。前一个和下一个链接正确加载。它们是带有OnClick事件的LinkButtons,它使Response.Redirect(PrevLink);例如,其中PrevLink是页面重定向的链接~/details.aspx?Id=5)。

我在整个eventandler和HistoryEventArgs中异步控制导航,所以当我按下浏览器的后退按钮时,一切都很好,我得到了默认的预期结果。aspx页面。每当在默认页面中触发回发时,例如,当更改gridview的页面索引时,或者在过滤器中执行新查询时,我调用ScriptManager的AddHistoryPoint并保存几个键和值(过滤器字段,页数等)。

问题来了,当我按下返回列表链接按钮。我希望数据与进入详细页面之前相同。我有Response.Redirect("~/default.aspx")在这个按钮的OnClick事件。

你有什么好主意吗?

非常感谢!


从这里的答案复制代码

谢谢你的回答。@Guvante我不想把"返回列表"放在客户端,因为当我编辑详细信息页面时,导航控件的可见属性被设置为false。我想我没有正确地表达自己。但是我没有回应。在aspx页面的OnClick事件中进行重定向。我在页面的源代码是OnClick=lkbBackToList_Navigate.

我在后面的代码中是这样写的:

protected void lkbNext_Navigate(object sender, EventArgs e)
{
   Response.Redirect(NavigationViewModel.NextUrl);
}
protected void lkbPrevious_Navigate(object sender, EventArgs e)
{
   Response.Redirect(NavigationViewModel.PreviousUrl);
}
protected void lkbBackToList_Navigate(object sender, EventArgs e)
{
   Response.Redirect(NavigationViewModel.BackToListUrl);
}
@msarchet this is some of my code in default.aspx code behind. When I do postback I save the state of the filters, pageindex and so on in session
public event EventHandler<HistoryEventArgs> CaptureClientBrowsing;
protected void Page_OnInit(EventArgs e) 
{
    this.CaptureClientBrowsing += new EventHandler<HistoryEventArgs>(CaptureClientBrowsing_Event); 
}
protected override void SaveDataInSession() 
{
    SaveInSession("FilterViewModel", this.FilteringControl.ViewModel);
    SaveInSession("PageIndex", this.CurrentPageIndex); //CurrentPageIndex is a property with the page index of the gridview 
}
protected void CaptureClientBrowsing_Event(object sender, HistoryEventArgs e) 
{    LoadDataFromSession(e.State); //e.State is a NameValueCollection with the values stored in session for example FilterViewModel has the user control FilteringControl and "PageIndex" has the page index of the gridview    ControlsDataBinding(); 
}

SaveInSession方法只保留Session[key] = object,其中key是一个字符串,如下所示:

string key = string.Format("{0}.{1}.{2}", this.GetType(), nameValue, index); 

键的一个例子是

"ASP.customers_default_aspx.PageIndex.1"` so `Session[key]=1

如果我点击网格视图的其他页面(例如第6页),键变量的值将是

"ASP.customers_default_aspx.PageIndex.2"` and `Session[key]=5

这就是我被卡住的地方。如果我从详细信息页面浏览到默认页面,在浏览器中单击返回,则CaptureClientBrowsing_Event会触发,控件也会正确加载,过滤器的值也会正确加载。

我想要的是,当我点击LinkButton"返回列表"的控件和过滤器也被加载。如果没有历史参数,如何获得NameValueCollection ?如果我单击三次"下一步",然后单击"返回"以列出我如何知道要加载的Session值?

可能有很多问题,这很难处理,但我已经尽力做到最具体。

在.net问题中,返回列表上一个下一个控件

当用户从列表页转到详细页然后单击浏览器返回btn时,它已经正常工作了。CaptureClientBrowsing事件是如何触发的?你能告诉我邮编吗?

当他们点击返回列表时,你不能重用相同的机制吗?

更新:那么,当您将Response.Redirect()发送到列表页时,就需要发送额外的状态信息。

您可以使用任何常用技术:传递querystring参数,设置cookie或设置另一个Session变量。

在listpage Init或Load中检测该信号,LINQ查询会话键以获得maxHistoryIndex,然后使用从maxHistoryIndex派生的键从会话中恢复状态。

。如果他们点击详细页面后,通过listpage页面3次,maxHistoryIndex=3,你可以恢复Session[String.Format("ASP.customers_default_aspx.PageIndex.{0}", maxHistoryIndex)]

我有Response.Redirect("~/default.aspx")在这个按钮的OnClick事件。

问题是这样做会导致列表页面被加载,就好像它是新的一样。相反,我建议通过将onclick客户端设置为history.go(-pages)来跟踪远离列表的页面数量并返回到它。