我需要帮助,因为我没有找到我使用MVVM的项目的解决方案。一方面我有一个默认值。它包含一个带有两个用户控件的UpdatePanel。第一个控件是一个FilterControl,其中包含一些要过滤的字段。第二个控件是GridView,当我按下FilterControl中的按钮搜索时,它允许分页并从数据库中填充数据。假设查询返回100条记录。如果我将PageSize设置为20个结果那么GridView中就有5个页面?
另一方面,我有一个带有FormView的Details页面,该页面从GridView接收项目的Id参数并显示有关该项目的信息。就在asp:FormView代码之上,我有另一个用户控件,通过相应的ViewModel从会话变量中的gridview中过滤数据,并计算哪些项目应该是下一个和上一个,所以我有一个"返回列表"链接和"上一个"one_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值?
可能有很多问题,这很难处理,但我已经尽力做到最具体。
当用户从列表页转到详细页然后单击浏览器返回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)
来跟踪远离列表的页面数量并返回到它。