返回列表上一页下一页.NET问题中的控件

时间:2011-07-22 13:31:36

标签: c# asp.net

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

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

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

当我按下返回列表LinkBut​​ton时出现问题。我希望数据与进入详细信息页面之前的数据相同。我在此按钮的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将触发并正确加载控件以及过滤器的值。

我想要的是当我点击LinkBut​​ton“返回列表”时,控件和过滤器也会被加载。如果我没有历史记录,如何获取NameValueCollection?如果我单击三次到下一个,然后单击Bak列出如何知道要加载的会话值?

也许有很多问题,这很难处理,但我已经尝试过最具体的问题。

2 个答案:

答案 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)]