我需要帮助,因为我没有找到我正在使用MVVM的项目的解决方案。 一方面,我有一个Default.aspx,它包含一个带有两个用户控件的UpdatePanel。第一个控件是FilterControl,其中包含一些要过滤的字段。 第二个控件是一个GridView,当我按下FilterControl中的按钮搜索时,它允许分页并填充数据库中的数据。假设查询返回100条记录。因此,如果我将PageSize设置为20个结果,我的GridView中有5个页面可以吗?
另一方面,我有一个带有FormView的详细信息页面,该页面从GridView接收项目的Id参数并显示有关它的信息。在asp:FormView代码之上我有另一个用户控件,它通过相应的ViewModel从Session变量中获取从gridview过滤的数据,并计算下一个和之前应该是哪个项目,所以我有一个“返回列表”链接和“上一页“和”下一页“链接。前一个和下一个链接正确加载。它们是带有OnClick事件的LinkButtons,它使Response.Redirect(PrevLink);例如,PrevLink是页面重定向的链接〜/ details.aspx?Id = 5)。
我在整个eventHandler和HistoryEventArgs中异步控制导航,所以当我按下浏览器的Back按钮时一切都很好,我在default.aspx页面中得到了所需的结果。每当在默认页面中触发回发时,例如,在更改gridview的页面索引或在过滤器中执行新查询时,我调用ScriptManager的AddHistoryPoint并保存几个键和值(Filter字段,页数,等)。
当我按下返回列表LinkButton时出现问题。我希望数据与进入详细信息页面之前的数据相同。我在此按钮的OnClick事件中有Response.Redirect(“〜/ default.aspx”)。
您对如何管理这个有什么想法吗?
非常感谢!!
从答案中复制代码
感谢您的回答。 @Guvante我不想在客户端放置“返回列表”,因为当我编辑“详细信息”页面时,导航控件的visible属性设置为false。我想我没有正确表达自己。但是我没有在aspx页面的OnClick事件中使用Response.Redirect。我在页面的源代码中有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?如果我单击三次到下一个,然后单击Bak列出如何知道要加载的会话值?
也许有很多问题,这很难处理,但我已经尝试过最具体的问题。
答案 0 :(得分:0)
我在此按钮的OnClick事件中有Response.Redirect(“〜/ default.aspx”)。
问题是这样做会导致列表页面被加载,就好像它是新的一样。我建议改为跟踪列表中的页数,并通过将onclick客户端设置为history.go(-pages)
返回到该页面。
答案 1 :(得分:0)
当用户从listpage转到detailpage然后点击浏览器Back btn时,你说它已经正常工作了。 CaptureClientBrowsing事件是如何触发的?你可以发布显示该代码的代码吗?
单击“返回列表”时,您是否无法重用相同的机制?
更新:
好的,当您Response.Redirect()
到列表页面时,需要再发送其他状态信息。
您可以使用任何常用技术:传递querystring参数,设置cookie或设置另一个Session变量。
检测列表页面Init或Load中的信号,LINQ查询Session键以获取maxHistoryIndex,然后使用从maxHistoryIndex派生的键从Session恢复状态。
E.g。如果他们在浏览列表页面3次后点击了详细信息页面,则maxHistoryIndex = 3并且您可以恢复Session[String.Format("ASP.customers_default_aspx.PageIndex.{0}", maxHistoryIndex)]