<span id="myarticleshow">
<table bgcolor="#f5f5f5" border="0" cellpadding="0" cellspacing="0" width="100%"><tbody><tr><td align="middle" height="30"></td></tr></tbody></table><br>
<div>
<p><font id="zoomt" style="FONT-SIZE: 14px"> </font></p>
<p><font id="zoomt" style="FONT-SIZE: 14px"><strong>引子</strong><br> 这是一个极其困难的题目,仅仅是描述一遍,都会非常困难,不过我尝试一下,希望能描述清楚:</font></p>
<font id="zoomt" style="FONT-SIZE: 14px"> <p> 我们公司是采用list/Detail的页面逻辑,即list页面有一个DataGrid,列出了一些项,点击其中一项后,页面跳转到Detail页面查看该项的详细。Detail页面有一个返回按钮,点击后即返回到list页面。list中的数据列表通常是经过筛选的,如xxx大于20的,然后还经过了排序的。 </p> <p> 现在问题是这样的: </p> <p> 用户要求,当从Detail返回到list中时,数据列表中的状态不变。 </p> <p> 公司认为,这是一个合理的要求,因为数据量实在太大,谁都不想返回list就又得从第一页看起。 </p> <p> 还要求,刚才看的Detail的项目必须是在list的数据列表的当前页,而不一定是进入前list数据列表的那一页;但如果在Detail中把当前项删除,返回则必须是在进入前list数据列表的那一页。 </p> <p> 更麻烦的是,在Detail页时用户可能跳转到若干个相关页,这些相关页也可能还有DataDrid,然后用户会在跳入相应的Detail页中,这些相应的状态也要得到保持。 </p> <p> 而且还会可能出现一个list页中会有多个DataGrid。 </p> <p><strong>举个例子吧:</strong></p> <p>用户查看A_list,A_list中有DataGrid_A1和DataGrid_A2,其中的数据都是经过筛选了的;然后他查看项A1.1这条数据,这就进入了A1.1_Detail;接着又跳入了A1.1的相关页面A1.1_Detail2,这个页面有一个DataGrid_A1.1,他进行筛选、排序;再跳入A1.1的另一个相关页面,这个页面是一个list页面A1.1_List,其中有一个DataGrid_A1.11,很显然,这个页面的数据也是筛选过的,用户给他排序;再进入其中一项的Detail页面A1.11.1,修改其中的数据……</p> <p>好,做过这些之后,他返回。先回到了A1.1_List,要求DataGrid_A1.11的筛选条件、排序方式不变,刚才访问的那一项在DataGrid当前页上,之前可能该项时在第二页上,现在可能是在第四页,那就显示第四页吧;接着返回到A1.1_Detail2,这个页面上的DataGrid_A1.1筛选条件、排序方式、当前页码不变;再返回到A1.1_Detail,删除了这条A1.1数据;最后返回到A_list,这时要求该页上的两个DataGrid的筛选条件、排序方式不变,都显示之前所在的页码。</p> <p>更可怕的是,真正的用户他未必就会这么原路返回,所以你别想让这些页面状态数据遵循后进先出原则。</p> <p><strong>请问该怎么做?</strong></p> <p><strong>出现这个问题的原因<br></strong> 如果是在Windows程序中,这就非常简单了,因为从第一,某记录的Detail及其相关信息,通常是一个窗体的多个选项卡而已;即使是打开另一个窗体,也不过是把本身Hide(隐藏)起来了而已,等返回的时候再Show出来即可。归根结底,Windows程序是一个有状态的应用程序,一切都很简单。</p> <p> 到了Web就不一样的,Web是无状态的,页面的每一次回传,都不知道自己的某一个变量之前是什么值,更别说页面之间了,每一个网页,都不知道自己从哪里(哪个页面)来。</p> <p><strong>问题分析<br></strong> 这么一个难办的问题,看都看得头晕了,可是要解决问题,还是得用清醒的大脑想问题。</p> <p> 基本思路:保存前面的网页的状态数据,跳转到一个新的页面时,该页面保存前面网页的状态数据,然后在返回时,该网页将原数据取回。</p> <p> </p> <p> 我们先来看一看页面间互传数据该怎么办。</p> <p> 一般而言,都是用Url参数的方式,但在这里显然失去了效用,Url有长度限制,而且这么多的参数,装配Url字符串就会让你头疼死掉。</p> <p> 怎么办呢,只好用另外一种办法了:</p> <p> 从一个页面跳转的时候,不要用Response.Redirect,而应用Server.Transfer,然后再目标网页中使用Context.Handler,如下所示:</p> <p> 前一个网页的类是abc,后一个网页是dbc.aspx,</p> <p>在前一个网页abc中定义公开字段</p> <p>public string ccc;</p> <p>那么在abc中跳转的时候用</p> <p> Server.Transfer(dbc |
|