使用Cross-Page Postback(跨頁面提交)在頁面間傳遞數據

頁面間傳遞數據的幾種方法

在頁面間傳遞數據時,我們有以下幾種選擇:

1、Query String

??? 一個很常見的方法,Query String是URL中問號之后的那一部分。其優點在于它是輕量級的,不會給服務器帶來任何負擔。而它也有幾個缺點:傳遞的信息僅限于簡單的字符串,而且必須是合法的URL字符;信息是對用戶是可見的,因而存在安全性問題;用戶可能會嘗試手動修改查詢字符串,這可能是程序未預料到或不能防范的;很多瀏覽器對URL的長度都有所限制(通常為1KB到2KB)。

2、Cookie

??? Cookie是創建在客戶端硬盤上(或者,如果它們是臨時的,則在內存中)的小文件。其優點在于使用時不易被用戶察覺,可被程序中每個頁面使用,并且可將數據長期保存。但它也有一些與Query String 相同的缺點:僅限于簡單的字符串信息;一旦用戶找到了相應的文件,它們也是易于訪問和閱讀的。所以Cookie最好不要用于保存復雜的或私密的信息。

3、Session

??? 可以在源頁面中將數據保存在Session中,然后在目標頁面中讀取這些數據。注意:將大量的信息存儲在Session中會嚴重影響服務器的性能。

4、Server.Transfer

??? 要進行服務器端的重定向,可以使用Server.Transfer。因為在服務器端執行,Server.Transfer方法不需要請求另一頁面。使用HttpContext,我們可以在目標頁面中訪問源頁面中的數據。其缺點是,瀏覽器并不了解返回給它的是另外一個頁面,它在地址欄中會顯示第一個頁面的URL,這會讓用戶陷入混亂,在他們使用書簽的時候也會產生麻煩。所以不推薦該方法。

5、其它

??? 還可以使用緩存(Cache)來存儲數據,可在程序的任意處訪問緩存。建議僅對那些修改不太頻繁但經常使用的數據使用緩存。 另外在某些特定情況下還可以使用Application變量,如統計頁面的點擊數等。

使用Cross-Page Postback

ASP.NET 2.0中引入了一個新的方法:跨頁面提交,即postback觸發在另一個頁面。這種技術聽起來很是簡單,但卻存在隱患。一不小心,就會導致你創建的頁面緊密耦合,難以維護和調試。

支持跨頁面提交的機制是一個名為PostBackUrl的屬性,該屬性由IButtonControl接口定義,實現這個接口的按鈕控件包括ImageButton,LinkButton,Button。將PostBackUrl屬性值設置為另一個web窗體的名稱(即URL),當用戶點擊按鈕時,頁面將被提交到新的URL。

看下面這個示例,該示例包括源頁面CrossPage1.aspx和目標頁面CrossPage2.aspx:?

CrossPage1.aspx

<html?xmlns="http://www.w3.org/1999/xhtml"?>
<head?runat="server">
????
<title>Source?Page</title>
</head>
<body>
????
<form?id="form1"?runat="server">
????
<div>
????????FirstName:?
<asp:TextBox?runat="server"?ID="txtFirstName"></asp:TextBox>
????????
<br?/>
????????LastName:
&nbsp;<asp:TextBox?runat="server"?ID="txtLastName"></asp:TextBox>?
????????
<br?/>
????????
<asp:Button?runat="server"?ID="cmdSubmit"?PostBackUrl="~/CrossPage2.aspx"?Text="Cross-Page?Postback"?/>
????
</div>
????
</form>
</body>
</html>

CrossPage1.aspx不包含任何代碼,效果如下:

現在點擊按鈕,該頁面就被提交到CrossPage2.aspx了。此時CrossPage2.aspx頁面可以使用Page.PreviousPage屬性與CrossPage1.aspx進行交互了,下面這個事件處理函數演示了如何獲取源頁面的標題并顯示它:

if?(PreviousPage?!=?null)
{
????lblInfo.Text?
=?"You?came?from?a?page?titled?"?+?PreviousPage.Header.Title;
}



注意:該方法在訪問PreviousPage對象前先對其作了null檢查,如果結果為false,表明沒有跨頁面提交發生,也就是說,CrossPage2.aspx是被直接請求的,或者由其自身提交,此時PreviousPage對象不可用。

從源頁面中獲取更多數據

上面那個示例作了一個有趣的嘗試,但僅僅如此,我們還是不能傳遞任何有用的信息。?

要獲取源頁面中控件的值,可以使用FindControl方法:

if?(PreviousPage?!=?null)
{
????lblInfo.Text?
=?"You?came?from?a?page?title?"?+?PreviousPage.Header.Title;

????
string?firstName?=?(PreviousPage.FindControl("txtFirstName")?as?TextBox).Text;
????
string?lastName?=?(PreviousPage.FindControl("txtLastName")?as?TextBox).Text;
????lblInfo.Text?
+=?"<br?/>";
????lblInfo.Text?
+=?"your?full?name:?"?+?firstName?+?"?"?+?lastName;
}

要獲得更多信息,我們需要將PreviousPage引用轉換為適當的頁面類(本示例中是CrossPage1類):

if?(PreviousPage?!=?null)
{
????CrossPage1?prevPage?
=?PreviousPage?as?CrossPage1;
????
if?(prevPage?!=?null)
????{
????????
//?此時可以訪問源頁面的公共屬性
????}
}

另外,除了在代碼中進行類型轉換,還可以在.aspx頁面中添加PreviousPageType指示字:

<%@ PreviousPageType VirtualPath="~/CrossPage1.aspx" %>

此時,PreviousPage屬性會自動使用CrossPage1類型,編輯器中的智能提示也可以使用了。但是這種方法相當脆弱,因為你只能使用一個頁面類!因此,出于靈活性考慮,使用類型轉換的方法會更好。

好了,不管怎樣,現在已經將PreviousPage對象轉換為合適的頁面類型了,但是你還是不能直接訪問它包含的控件對象。這是因為這些控件都被聲明為保護類型(protected),此時的解決方案是使用屬性。

比如,如果希望公開源頁面上兩個文本框控件的值,可以添加屬性來封裝控件對象,如在CrossPage1類中添加屬性:

public?TextBox?FirstNameTextBox
{
????
get?{?return?txtFirstName;?}
}

public?TextBox?LastNameTextBox
{
????
get?{?return?txtLastName;?}
}

但是,這通常不是最好的方法。其問題在于它公開了太多的細節,目標頁面可以讀取文本框控件的所有內容了。如果過段時間需要修改源頁面,決定使用不同的輸入控件,維護這些屬性就相當困難了,因為你不得不修改兩個頁面的代碼。

更好的方法是定義更具體的屬性,它們應當僅僅提供你需要的東西。比如,你可以考慮添加一個FullName屬性,該屬性讀取兩個文本框的值:

public?string?FullName
{
????
get?{?return?this.txtFirstName.Text?+?"?"?+?this.txtLastName.Text;?}
}

這樣做,兩個頁面的關系就變得清晰、簡單并易于維護了。如果你決定在CrossPage1中使用新的輸入控件,只要修改CrossPage1頁面就好了。CrossPage2中的代碼也相應地修改如下:

if?(PreviousPage?!=?null)
{
????lblInfo.Text?
=?"You?came?from?a?page?titled?"?+?PreviousPage.Header.Title?+?"<br?/>";

????CrossPage1?prevPage?
=?PreviousPage?as?CrossPage1;
????
if?(prevPage?!=?null)
????{
????????lblInfo.Text?
+=?"You?typed?in?this:?"?+?prevPage.FullName;
????}
}

?

下面是CrossPage2的最終結果:



跨頁面提交確實非常有用,但它們也會使頁面變得復雜。如果你允許多個源頁面提交到同一目標頁面,你就得編寫代碼邏輯以判斷頁面來自何處,然后作出相應處理。要避免這種煩惱,簡單的方法就是只在兩個特定的頁面間使用它。


??????????????????????????????????????????????????????????????????????????????????????????????????By Anders Cui

參考:
? Beginning.ASP.NET.2.0.in.C.Sharp.2005.From.Novice.to.Professional by Matthew MacDonald



本文轉自一個程序員的自省博客園博客,原文鏈接:http://www.cnblogs.com/anderslly/archive/2007/01/31/crosspagepostback.html,如需轉載請自行聯系原作者。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454621.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

synchronized 和 lock 的區別

lock更靈活&#xff0c;可以自由定義多把鎖的加鎖解鎖順序&#xff08;synchronized要按照先加的后解順序&#xff09; 提供多種加鎖方案&#xff0c;lock 阻塞式, trylock 無阻塞式, lockInterruptily 可打斷式&#xff0c; 還有trylock的帶超時時間版本。 本質上和監視器鎖&a…

win10怎么設置默認輸入法_win10系統輸入法失效打不了字怎么辦

大家好&#xff0c;今天分享一篇來自小白系統官網(xiaobaixitong.com)的圖文教程。最近有用戶反映自己電腦上的win10系統出現輸入法失效打不了字的問題&#xff0c;想知道有沒有解決該問題的方法。小編經過一番查找后給大家整理出了針對該問題的解決方法&#xff0c;下面就讓我…

Python 內置模塊之 時間模塊 time

time模塊提供各種時間相關的功能,與時間相關的模塊有&#xff1a;time,datetime,calendar 必要說明&#xff1a; 這個模塊的功能不是適用于所有的平臺 這個模塊中定義的大部分函數是調用C平臺上的同名函數實現 一些術語和約定的解釋&#xff1a; 時間戳(timestamp)的方式,返…

linux找link原路徑,readlink命令找出符號鏈接所指向的位置

1.釋義找出符號鏈接所指向的位置2.系統幫助用法&#xff1a;readlink [選項]... 文件...輸出符號鏈接值或權威文件名。-f, --canonicalize遞歸跟隨給出文件名的所有符號鏈接以標準化&#xff0c;除最后一個外所有組件必須存在-e, --canonicalize-existing遞歸跟隨給出文件名的所…

國產毫米波雷達領域的領頭羊,木牛科技將在明年量產77GHz汽車雷達

國內的汽車毫米波雷達市場風潮起于2015年前后&#xff0c;彼時國內的毫米波雷達企業已經發展很多年&#xff0c;但大都在軍工領域。 面對突然出現的汽車毫米波雷達市場熱潮&#xff0c;國內很快涌現出了一大批雷達的初創企業&#xff0c;努力擠進這一亦新亦舊的市場。 說是新&a…

面試風云錄(02) - 與頂級CTO交手的難忘經驗...

大部分面試都是尋找團隊伙伴或成員&#xff0c;很少是面試高層&#xff0c;因為職級比我們高的人&#xff0c;自然會有更高層的人面試他們&#xff0c;但這次分享的不是一般面試&#xff0c;而是我跟頂級CTO交手的經驗&#xff0c;盡管為了顧慮當事人隱私&#xff0c;我已經隱去…

MySQL 之 performance_schema

背景&#xff1a; 自 MySQL5.5開始&#xff0c;MySQL新增了一個數據庫&#xff1a;PERFORMANCE_SCHEMA&#xff0c;主要用于收集數據庫服務器性能參數。此庫中表的存儲引擎均為PERFORMANCE_SCHEMA&#xff08;用戶不能創建存儲引擎為PERFORMANCE_SCHEMA的表&#xff09;。MySQ…

DNS解析原理與Bind部署DNS服務

DNS是什么&#xff1f; DNS&#xff08;Domain Name System&#xff0c;域名系統&#xff09;是互聯網上最核心的帶層級的分布式系統&#xff0c;它負責把域名轉換為IP地址、反查IP到域名的反向解析以及宣告郵件路由等信息&#xff0c;使得基于域名提供服務稱為可能&#xff0c…

qt 獲取本機的wifi密碼_還在記密碼?這款開源免費的賬號密碼管理神器趕緊收了...

工作中涉及到得賬號密碼&#xff0c;你是怎么記錄得&#xff1f;如果是文檔word或者excel記錄&#xff0c;那么回非常麻煩&#xff0c;每次還得打開。如果是瀏覽器自己記錄&#xff0c;如果更新密碼&#xff0c;又記不得。尷尬&#xff01;今天大衛給大家推薦一款開源免費得賬號…

adaptec raid linux,adaptecraid卡管理軟件在windows和linux下的安裝使用介紹(7頁)-原創力文檔...

adaptec raid卡管理軟件在 windows和linux下的安裝使用文檔l.adaptec raid卡的管理軟件在 windows下安裝后的運行界面如下圖:adaplecadaplec點擊connect后&#xff0c;便可進入管理軟件的主界面&#xff0c;如下圖:在這個主界面中可以選擇要操作的 raid卡&#xff0c;例如本例中…

think queue 消息隊列初體驗

使用的是tp5 自帶的消息隊列 thinkphp top里的 消息隊列框架 think-queue 這是thinkphp官方團隊開發的一個專門支持隊列服務的擴展包 消息隊列應用場景&#xff1a; 消息隊列適用于大并發或者返回結果 時間有點長并需要批量操作的第三方接口。 當前使用快遞單號獲取&#xf…

Linux快速計算MD5和Sha1命令

Linux計算MD5和Sha1的命令 MD5 MD5即Message-Digest Algorithm 5&#xff08;信息-摘要算法 5&#xff09;&#xff0c;用于確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一&#xff08;又譯摘要算法、哈希算法&#xff09;&#xff0c;主流編程語言普遍已有MD5實現。 S…

win10無法運行C語言文件,主編告訴你win10打不開pdf文件的詳盡處理辦法

win10打不開pdf文件的問題大家有沒有發現呢&#xff1f;今天有一個網友就來向小編詢問處理辦法。其實不知都還有多少用戶遇到了win10打不開pdf文件的問題&#xff0c;我們可以嘗試著自己來處理win10打不開pdf文件的問題&#xff0c;我們其實只需要這樣操作&#xff1a;1、2、就…

MySQL 自帶的四個數據庫 介紹

背景 通過終端登錄mysql數據庫&#xff08;或直接用客戶端工具&#xff09;查看全部數據庫,如下&#xff1a; 5.7及以上自帶庫為&#xff1a;information_schema、mysql、performance_schema、sys&#xff1b; 5.6自帶的庫為&#xff1a;information_schema、mysql、performa…

簡單繪圖軟件實現mfc大作業_紙筆書寫|可直播可微課可寫作業可批改的手寫板,快來愛“我”吧...

線上教學進入下半場&#xff0c;我們需要什么&#xff1f;走過線上教育的探索期&#xff0c;相信不少老師已經對線上教學駕輕就熟了&#xff0c;但對于線上教學來說&#xff0c;合適的教學支持工具始終是必不可少的。不論是文科教師&#xff0c;還是理科教師&#xff0c;對于真…

一道多線程通信實例分析

程序如下&#xff1a; 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354public static void main(String[] args) throws Exception{ final List list new ArrayList(); final Object lock new Object(); Thread t1 …

react native (一)

開始接觸app方面的工作&#xff0c;真心塞~又開始了周而復始的死磕一個問題專坐一整天的節奏&#xff0c;關鍵是還沒有成績&#xff0c;實在無語。╮(╯▽╰)╭&#xff0c;還是總結一下最近心塞歷程吧……react native中文網&#xff1a;http://reactnative.cn/docs/0.48/gett…

2臺電腦一根網線傳文件_「教程」如何快速的在兩臺電腦間傳輸大文件?

兩臺電腦如何傳輸文件我們常見的就是使用U盤或者網盤進行傳輸但是速度非常的慢我們需要一種文件可以直接復制到另一臺設備的方法首先準備一根網線然后將兩臺電腦連接到同一局域網內在右下角的小電腦打開網絡設置找到共享選項然后將公用文件夾共享開啟在下面密碼保護的共享中你可…

C語言信息系統貼吧,急 c語言學生信息管理系統

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓scanf("%s",s.name);printf("請輸入學生的性別&#xff1a;");scanf("%s",s.sex);printf("請輸入學生的班級&#xff1a;");scanf("%s",s.grade);printf("請輸入學生的成績…

Python 內置模塊之 re

前言 輸入一個手機號18333333333&#xff0c;你是怎么知道這串數字是手機號呢&#xff0c;假如現在你用python寫一段代碼&#xff0c;類似&#xff1a; phone_number input(please input your phone number&#xff1a;) 你怎么判斷這個phone_number是合法的呢&#xff1f;…