天天看點

asp.net 2.0 的跨頁投遞

asp.net 2.0 的跨頁投遞

轉自:http://www.dabaoku.com/jiaocheng/biancheng/aspnet/200910101080.shtml

标準HTML表單(form元素)允許你向另外一個頁面或者應用程式傳遞和發送資料資訊,方法是使用表單元素。在ASP.NET 1.x中,網頁則利用投遞機制,把頁面資料送出給該頁本身。對于ASP.NET 2.0,它的功能有所擴充,能夠允許跨頁送出。這周就讓我們來探讨這個新特性。

傳統辦法

為了便于比較,我想花一分鐘來回顧網頁傳遞資料的老方法。HTML的表格元素有一個action(動作)屬性,用來指定伺服器端哪項資源(所謂資源,是指一個網頁、一段腳本、程式等)來處理這些送出的資料。下面的代碼便是一個樣例。

<html>

<head><title>Sample HTML form</title></head>

<body>

<form name="frmSample" method="post" action="target_url">

<input type="text" name="fullname" id="fullname" />

<input type="button" name="Submit" value="submit" />

</form>

</body></html>

在文本域(名字是fullname)中輸入的值将被送出給表單元素的action屬性指定的頁面或者程式。對于ASP.NET開發者,即使曾經用過标準HTML表單,也是極不多見的。

ASP.NET開發者面對要從一個網頁向另一個網頁傳遞資料資訊的任務時,方法選擇的餘地是異常廣闊的。它們包括會話變量(session variables)、cookies、querystring 變量、caching(網頁緩存),甚至Server.Transfer方法,但是ASP.NET 2.0還提供了另外一種選擇。

ASP.NET 2.0提供的又一辦法

在設計ASP.NET 2.0的時候,微軟認識到了在網頁間交叉傳遞資料的需求。有了這個意識之後,就為ASP.NET的button(按鈕)控件增加了一項PostBackUrl屬性。它允許你在使用者送出的時候,指明這張表單和上面的資料送往何方(也就是由PostBackUrl屬性指定的URL值确定)。一般來講,跨頁傳遞是用戶端在背景使用JavaScript進行傳送的過程。

<%@ Page language="vb" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><html><head><title>Cross Postback Example</title></head><body><form id="frmCrossPostback1" method="post" runat="server"><asp:Label ID="lblName" runat="server" Text="Name:"></asp:Label><asp:TextBox ID="txtName" runat="server"></asp:TextBox><br /><asp:Label ID="lblE-mailAddress" runat="server" Text="E-mail:"></asp:Label><asp:TextBox ID="txtE-mailAddress" runat="server"></asp:TextBox><br /><asp:Button ID="btnSubmit" runat="server" Text="Submit" PostBackUrl="CrossPostback2.aspx" /></form></body></html> 中的ASP.NET頁面擁有兩個文本域(分别表示name(名字)和e-mail(電子郵件)),以及一個用來送出資料的button(按鈕)。這個送出按鈕的PostBackUrl屬性被指定為另外一個網頁,這樣使得表單送出的時候,資料可以發送到那個頁面。注意:這個例子中,表單元素通過設定method(方法)屬性,讓表單送出時采用post[2]送出方式,但這不是必要的,因為所有cross postback(跨頁投遞)根據設計均使用post方法。

使用先前頁面

ASP.NET頁面經由跨頁投遞的調用而載入的時候,它上面的對象的IsPostBack屬性不會被觸發。不過,有一項叫做PreviousPage(前一頁)的屬性使你能夠通路和使用那些應用跨頁投遞的頁面。

每當一個跨頁請求發生時,目前頁的PreviousPage屬性就把促發投遞的頁面引用儲存下來。如果頁面的産生不是來自跨頁投遞的激發,或者說頁面處于不同的程式組,那麼PreviousPage屬性将不會被初始化。

你可以通過檢查PreviousPage對象來确定頁面的載入是否為跨頁投遞的結果。值如果為null,則說明是普通的載入,而非null值則表明網頁來自跨頁投遞。此外,頁面類(Page class)還包含了一個稱作IsCrossPagePostBack的方法(method),專門用來确定頁面是不是跨頁投遞的結果。

一旦确定發生了跨頁投遞,你就可以通過PreviousPage對象的FindControl方法去通路調用頁(calling page)上的控件。下面的代碼是我們例子中的第二頁;它由前面列出的頁面所調用。

<%@ Page language="vb" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<html><head>

<title>Cross Postback Example 2</title>

</head><body>

<script language="vb" runat="server">

Sub Page_Load()

If Not (Page.PreviousPage Is Nothing) Then

If Not (Page.IsCrossPagePostBack) ThenResponse.Write("Name:" + CType(PreviousPage.FindControl("txtName"), TextBox).Text + "<BR>")Response.Write("E-mail:" + CType(PreviousPage.FindControl("txtE-mailAddress"), TextBox).Text + "<BR>")

End If

End If

End Sub

</script>

</body>

</html>

這個頁先判斷它是不是由跨頁投遞所調用。如果是,就通過FindControl方法通路來自調用頁的數值,并把用此方法得到的控件轉換為TextBox控件,然後顯示它們的Text(文本)屬性的内容。

你可以把整個PreviousPage對象轉換成觸發跨頁投遞的頁面類型。這個方法允許你通路頁面的全局屬性(public properties)和方法。在我給出這項技術的執行個體之前,我有必要重寫第一個例子,包含進一些全局屬性。下面代碼是添加了兩個屬性的第一個清單,這兩個屬性用于通路域值。

<%@ Page language="vb" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<html><head>

<title>Cross Postback Example</title>

<script language="vb" runat="server">

Public ReadOnly Property Name

Get

Return Me.txtName.Text

End Get

End Property

Public ReadOnly Property E-mailAddress

Get

Return Me.txtE-mailAddress.Text

End Get

End Property

</script></head><body>

<form id="frmCrossPostback1" method="post" runat="server">

<asp:Label ID="lblName" runat="server" Text="Name:"></asp:Label>

<asp:TextBox ID="txtName" runat="server"></asp:TextBox><br />

<asp:Label ID="lblE-mailAddress" runat="server" Text="E-mail:"></asp:Label>

<asp:TextBox ID="txtE-mailAddress" runat="server"></asp:TextBox><br />

<asp:Button ID="btnSubmit" runat="server" Text="Submit" PostBackUrl="CrossPostback2.aspx" />

</form>

</body>

</html>

既然現在屬性已經建好,那你就能很容易通路它們。要警惕的是,Page類的PreviousPage對象必須轉換成正确的類型,這樣才能正确通路它的屬性。這可以通過把它轉換成合适的page類别的對象加以實作。

<%@ Page language="vb"%>

<%@ Reference Page="~/CrossPostback1.aspx" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >

<html>

<head>

<title>Cross Postback Example 3</title>

</head><body>

<script language="vb" runat="server">

Sub Page_Load()

Dim cppPage As CrossPostback1_aspx

If Not (Page.PreviousPage Is Nothing) Then

If Not (Page.IsCrossPagePostBack) Then

If (Page.PreviousPage.IsValid) ThencppPage = CType(PreviousPage, CrossPostBack1_aspx)Response.Write("Name:" + cppPage.Name + "<br>")Response.Write("E-mail:" + cppPage.E-mailAddress)

End If

End If

End If

End Sub

</script>

</body>

</html>

說明了這一點,它在頁面頭部定義了調用頁的一項引用,那樣這個引用類型就能在代碼中使用。通過這項引用,實際的VB.NET代碼使用CType函數把PreviousPage對象轉換成了适當的類型。這之後,那些屬性就可以像代碼示範的那樣使用了。

關于上述清單中PreviousPage對象IsValid方法的使用在此提醒一下:前頁的IsValid屬性保證你對它操作之前,它已認證所有合法驗證測試。

總結

在網頁間傳遞資料參數有很多項應用,包括保持個人使用者資訊。祖傳的網頁解決方案,像使用querystring和cookies,允許你很容易當送出發生時從一個頁面指向另一個頁面。

ASP.NET 1.1除了提供額外方法外,對這些方法也能很好地支援,可是,ASP.NET 2.0依靠跨頁投遞,使這方面又有了長足發展。它讓一個網頁處理來自另一網頁的資料變得簡單。在你開發你的下一個ASP.NET 2.0程式的時候,可要好好利用這個新概念的優勢啊。

該文章轉摘自-網頁制作大寶庫(www.dabaoku.com) - 原文連結:http://www.dabaoku.com/jiaocheng/biancheng/aspnet/200910101080.shtml

繼續閱讀