網上每天有人問怎麼在webform頁面之間傳值,基本上來講,你們熟悉的是
(1)url字符串傳值
(2)session傳值
(3)直接讀取server.transfer過來的頁面上的數據
前面2個就不說了,你們都知道怎麼用,後面一個可能用的人比較少,這裏作一下介紹。
Web 窗體頁是應用程序中的類,所以能夠向處理任何類同樣爲它們建立屬性。可是,因爲 Web 窗體頁實際上僅在執行頁的過程當中存在,它們的生命週期很是短。所以,Web 窗體頁上屬性的用途至關有限,由於它們僅在處理頁的過程當中存在。可是,若是使用特定的技術將控件從一頁傳遞到另外一頁,後一頁仍能夠訪問前一頁上的屬性。
好比如今在一個webform頁面上(page.aspx)放置了一個label,在
private void Page_Load(object sender, System.EventArgs e)
{
this.Label1.Text="test";
}
咱們設定了它的值,再爲這個頁面類設定一個公開的屬性
public Label lab
{
get
{
return Label1;
}
}
返回的就是這個頁面上的一個Label
而後在這個頁面上放置一個按鈕,按鈕的click事件中添加以下代碼
Server.Transfer("newpage.aspx");
在newpage.aspx中一樣放置一個Label標籤,用來顯示前一個頁面那個Label的值,而後在Page_Load裏面加上以下代碼
if (!IsPostBack)
{
page p=(page)Context.Handler;
this.Label1.Text="傳過來的值是:"+p.lab.Text;
}
咱們運行這個程序,點擊按鈕,發現出現值傳過來了,可是瀏覽器的url顯示的仍是原來的page.aspx,說明server.transfer是不改變 瀏覽器的url的,其實這說明此事件僅僅是在服務器端完成,並無到客戶端,這也就是爲何能在無狀態的http下獲得前面一個頁面的數據的緣由,若是你 換成response.redirect,你是不能獲得任何東西的。分析一下上面的代碼newpage p=(newpage)Context.Handler的意思就是建立源頁類的實例變量,而後能夠向其分配 HTTP 對象(IHttpHandler類的一個實例),即接收初始請求的對象。這樣傳值的好處在於不像session同樣使用內存,特別適合大數據的狀況(其實 這不能稱傳值),壞處只能是同一個服務器頁面之間,並且url並無改變,用戶看了可能會糊塗。
對程序你能夠進一步改進,咱們如今傳的是一個Label的實例,你能夠在頁面間傳遞全部對象,甚至你能夠直接使用前面一個頁面的DataGrid! web