国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

頁面無限跳轉(zhuǎn)間如何保存頁面狀態(tài)(1)

2024-07-21 02:16:25
字體:
供稿:網(wǎng)友

最大的網(wǎng)站源碼資源下載站,

引子
這是一個極其困難的題目,僅僅是描述一遍,都會非常困難,不過我嘗試一下,希望能描述清楚:

我們公司是采用list/detail的頁面邏輯,即list頁面有一個datagrid,列出了一些項,點擊其中一項后,頁面跳轉(zhuǎn)到detail頁面查看該項的詳細(xì)。detail頁面有一個返回按鈕,點擊后即返回到list頁面。list中的數(shù)據(jù)列表通常是經(jīng)過篩選的,如xxx大于20的,然后還經(jīng)過了排序的。

現(xiàn)在問題是這樣的:

用戶要求,當(dāng)從detail返回到list中時,數(shù)據(jù)列表中的狀態(tài)不變。

公司認(rèn)為,這是一個合理的要求,因為數(shù)據(jù)量實在太大,誰都不想返回list就又得從第一頁看起。

還要求,剛才看的detail的項目必須是在list的數(shù)據(jù)列表的當(dāng)前頁,而不一定是進(jìn)入前l(fā)ist數(shù)據(jù)列表的那一頁;但如果在detail中把當(dāng)前項刪除,返回則必須是在進(jìn)入前l(fā)ist數(shù)據(jù)列表的那一頁。

更麻煩的是,在detail頁時用戶可能跳轉(zhuǎn)到若干個相關(guān)頁,這些相關(guān)頁也可能還有datadrid,然后用戶會在跳入相應(yīng)的detail頁中,這些相應(yīng)的狀態(tài)也要得到保持。

而且還會可能出現(xiàn)一個list頁中會有多個datagrid。

舉個例子吧:

用戶查看a_list,a_list中有datagrid_a1和datagrid_a2,其中的數(shù)據(jù)都是經(jīng)過篩選了的;然后他查看項a1.1這條數(shù)據(jù),這就進(jìn)入了a1.1_detail;接著又跳入了a1.1的相關(guān)頁面a1.1_detail2,這個頁面有一個datagrid_a1.1,他進(jìn)行篩選、排序;再跳入a1.1的另一個相關(guān)頁面,這個頁面是一個list頁面a1.1_list,其中有一個datagrid_a1.11,很顯然,這個頁面的數(shù)據(jù)也是篩選過的,用戶給他排序;再進(jìn)入其中一項的detail頁面a1.11.1,修改其中的數(shù)據(jù)……

好,做過這些之后,他返回。先回到了a1.1_list,要求datagrid_a1.11的篩選條件、排序方式不變,剛才訪問的那一項在datagrid當(dāng)前頁上,之前可能該項時在第二頁上,現(xiàn)在可能是在第四頁,那就顯示第四頁吧;接著返回到a1.1_detail2,這個頁面上的datagrid_a1.1篩選條件、排序方式、當(dāng)前頁碼不變;再返回到a1.1_detail,刪除了這條a1.1數(shù)據(jù);最后返回到a_list,這時要求該頁上的兩個datagrid的篩選條件、排序方式不變,都顯示之前所在的頁碼。

更可怕的是,真正的用戶他未必就會這么原路返回,所以你別想讓這些頁面狀態(tài)數(shù)據(jù)遵循后進(jìn)先出原則。

請問該怎么做?

出現(xiàn)這個問題的原因
如果是在windows程序中,這就非常簡單了,因為從第一,某記錄的detail及其相關(guān)信息,通常是一個窗體的多個選項卡而已;即使是打開另一個窗體,也不過是把本身hide(隱藏)起來了而已,等返回的時候再show出來即可。歸根結(jié)底,windows程序是一個有狀態(tài)的應(yīng)用程序,一切都很簡單。

到了web就不一樣的,web是無狀態(tài)的,頁面的每一次回傳,都不知道自己的某一個變量之前是什么值,更別說頁面之間了,每一個網(wǎng)頁,都不知道自己從哪里(哪個頁面)來。

問題分析
這么一個難辦的問題,看都看得頭暈了,可是要解決問題,還是得用清醒的大腦想問題。

基本思路:保存前面的網(wǎng)頁的狀態(tài)數(shù)據(jù),跳轉(zhuǎn)到一個新的頁面時,該頁面保存前面網(wǎng)頁的狀態(tài)數(shù)據(jù),然后在返回時,該網(wǎng)頁將原數(shù)據(jù)取回。



我們先來看一看頁面間互傳數(shù)據(jù)該怎么辦。

一般而言,都是用url參數(shù)的方式,但在這里顯然失去了效用,url有長度限制,而且這么多的參數(shù),裝配url字符串就會讓你頭疼死掉。

怎么辦呢,只好用另外一種辦法了:

從一個頁面跳轉(zhuǎn)的時候,不要用response.redirect,而應(yīng)用server.transfer,然后再目標(biāo)網(wǎng)頁中使用context.handler,如下所示:

前一個網(wǎng)頁的類是abc,后一個網(wǎng)頁是dbc.aspx,

在前一個網(wǎng)頁abc中定義公開字段

public string ccc;

那么在abc中跳轉(zhuǎn)的時候用

server.transfer(dbc.aspx)

在后一個網(wǎng)頁使用

((abc)context.handler).ccc 就可以取出相應(yīng)的值了。



但是顯然這樣做還有一個問題,缺乏通用性。多個頁面跳轉(zhuǎn)怎么辦?而且context.handler.gettype()方法是無法使用的,會出現(xiàn)異常。

那就定義接口了。

把有關(guān)需要互傳的數(shù)據(jù)定義在接口里,多個網(wǎng)頁實現(xiàn)同一個接口。

查詢參數(shù)、排序條件、要顯示的當(dāng)前頁、要顯示在當(dāng)前頁的項目id……都定義在接口的實現(xiàn)里。



但問題是,網(wǎng)頁在跳轉(zhuǎn)的時候,數(shù)據(jù)會不斷積累,如你從list1跳轉(zhuǎn)到detail1,再跳轉(zhuǎn)到list2,再跳轉(zhuǎn)到detail2,這個時候detail2要保存前面三個網(wǎng)頁的數(shù)據(jù),而這三個網(wǎng)頁實現(xiàn)同一個接口,這樣可能會導(dǎo)致數(shù)據(jù)覆蓋的情況。

一般而言,面對這種情況的時候是設(shè)計一個堆棧似的的數(shù)據(jù)結(jié)構(gòu),每進(jìn)入到一個新的網(wǎng)頁時,都把原網(wǎng)頁的數(shù)據(jù)推入堆棧,這叫做保護(hù)現(xiàn)場。

可惜這也不能用,因為用戶并不會一定就會原路返回,如果用后進(jìn)先出的方式的話,會發(fā)現(xiàn)某個網(wǎng)頁要取回自己的數(shù)據(jù)卻發(fā)現(xiàn)無法取回了,能取到的不是自己的數(shù)據(jù)。

只能用數(shù)組了,而且這個數(shù)組還要是動態(tài)的。

那就把剛才的接口修改一下,改成一個類datainfo,然后再實現(xiàn)一個接口,接口里有一個動態(tài)數(shù)組,用來存放datainfo。



可是動態(tài)數(shù)組的元素是object,范圍太廣,我希望要嚴(yán)格一些,只允許存放而不是雜亂無章的堆在數(shù)組里,要是真的在接口里就實現(xiàn)一個動態(tài)數(shù)組,那你往里面塞datainfo,我往里面塞別的東東,那還不亂套了。

那就再動態(tài)數(shù)組外面包裝一下,使得它只允許存放datainfo。不能直接在接口中包裝,因為我要加入一些代碼來校驗存放進(jìn)去的是否只是datainfo,還是其他的什么東東。怎么辦呢,那就再自定義一個類datainfolist。并且這些類都要標(biāo)記為serializable,可序列化,這樣才可以在viewstate中保存狀態(tài)。



(未完待續(xù))
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 怀远县| 南郑县| 兴山县| 尤溪县| 原平市| 精河县| 九龙县| 罗源县| 岳池县| 乌鲁木齐市| 宁南县| 扎鲁特旗| 遂川县| 衡阳县| 北流市| 河西区| 平山县| 萍乡市| 忻州市| 仲巴县| 汝城县| 溆浦县| 乐至县| 密山市| 怀集县| 尼勒克县| 衡南县| 依兰县| 赤水市| 平利县| 宁城县| 砀山县| 福建省| 商水县| 漳平市| 青阳县| 旺苍县| 大足县| 大丰市| 成安县| 锡林郭勒盟|