欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
VB & WEB
 

針對 Microsoft Visual Basic 用戶(hù)的 ASP+ 和 Web 窗體

Anthony Moore Microsoft Corporation
2000年9月

 

摘要: 本文討論如何習慣于使用 ASP+ 和 Web Forms 設計器。該程序針對不熟悉 Web 開(kāi)發(fā)的 Microsoft Visual Basic 或類(lèi)似的 GUI 編程工具的傳統用戶(hù)。

目錄



您已經(jīng)具備的技能

如果您使用 Microsoft Visual Basic 但又不熟悉 Web 開(kāi)發(fā),則首先使用帶 ASP+ 的 Forms 設計器最為方便。 總的來(lái)講,在 ASP+ 中使用控件、屬性、事件和數據,與使用 Visual Basic 6.0 編寫(xiě) Windows 應用程序沒(méi)有太大差別。通過(guò)比較,ASP 和其它 Web 開(kāi)發(fā)環(huán)境確實(shí)有很大不同,從一種環(huán)境換到另一種環(huán)境進(jìn)行編程,可能就象再次學(xué)步。

到現在,您可能已見(jiàn)過(guò) Web 窗體演示,或者動(dòng)手試過(guò)一些,包括這一個(gè)。通常,下面是您要使用 Visual Studio 進(jìn)行的操作:

  1. 創(chuàng )建一個(gè)新的 Visual Basic Web 應用程序。

  2. 將一個(gè) Button 控件和一個(gè) Label 控件放到頁(yè)面上。

  3. 雙擊按鈕,以獲得一個(gè)事件處理器。

  4. 將 Label 文本改為“Hello World!”

  5. 運行該項目。

下面是您的第一個(gè) ASP+ 頁(yè)面在 Web Forms 設計器中的樣子:

圖 1. Web Forms 設計器中的一個(gè) ASP+ 頁(yè)面

我并不了解你,但我第一次這樣做時(shí),我的感覺(jué)是“這下可把 ASP 或 CGI 腳本干掉了。這真是太容易了!”

與創(chuàng )建 Windows 應用程序一樣,創(chuàng )建一個(gè)可靠且可縮放的 Web 應用程序也極其復雜。我們希望 ASP+ 能夠將這種復雜性的大部分隱藏起來(lái),就象 Visual Basic 1.0 為 Windows 開(kāi)發(fā)所做的那樣。我們還想將使這兩種經(jīng)歷盡量彼此相似,以便您可以“利用您已有的技能”。



大多數情況下您可以使用這些技能...大多數情況下

Web Forms 能夠奇妙地完成 Web 開(kāi)發(fā)任務(wù),就象 GUI 開(kāi)發(fā)一樣,以至于它能在安全方面給您一個(gè)錯誤的感覺(jué)。然而,在這兩者之間還存在一些最基本的差異,如果您不注意這些差異,就可能在著(zhù)手做的時(shí)候產(chǎn)生一些常見(jiàn)的錯誤。

在您第一次嘗試做以下各項時(shí),您可能會(huì )有些束手無(wú)策:

  1. 聲明并使用一個(gè)成員變量。

  2. 在運行時(shí)添加控件。

  3. 在頁(yè)面之間傳遞數據。

  4. 嘗試使用數據綁定。


震撼一: 頁(yè)面壽命

在頁(yè)面上添加一個(gè)計數器以統計這個(gè)按鈕被單擊的次數:

        Private myCounter As IntegerProtected Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)myCounter += 1Label1.Text = myCounter.ToString()End Sub

看起來(lái)它應能夠工作,但當您運行這個(gè)頁(yè)面時(shí),您會(huì )發(fā)現計數器的值永遠不會(huì )大于 1。

當借助控件事件和屬性做簡(jiǎn)單事情時(shí),看起來(lái)頁(yè)面和控件在創(chuàng )建后, 在用戶(hù)操作過(guò)程中將一直存在。即使我作為一個(gè)富有經(jīng)驗的 Visual Basic 用戶(hù),當第一次使用 ASP+ 時(shí),我都會(huì )有以下兩個(gè)關(guān)于頁(yè)面壽命的問(wèn)題:

  • 在將頁(yè)面廢棄之前,服務(wù)器將該頁(yè)面保留多長(cháng)時(shí)間?

  • 這些對象是否大量占用服務(wù)器的內存?

這兩個(gè)問(wèn)題的答案分別是“0 秒”和“否”。每次訪(fǎng)問(wèn)頁(yè)面時(shí),頁(yè)面及其控件在創(chuàng )建后被完全丟棄。只有在處理用戶(hù)請求的特定瞬間才會(huì )發(fā)生占用服務(wù)器內存的 Page 類(lèi)實(shí)例。

ASP+ 的偉大技術(shù)成就之一在于它能夠在到服務(wù)器的往返過(guò)程中保持大部分的頁(yè)面狀態(tài),并且從不在內存中保持頁(yè)面。然而,它并不是絕對地自動(dòng)保存任何事件,當您聲明一個(gè)新的成員變量時(shí),除非您明確地將其保存,否則它將被丟棄。這就是計數器例子為什么不能像預期設定的那樣工作。

以下是一個(gè)能夠正確運行的事件處理器的方案:

        Protected Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Dim myCounter As IntegermyCounter = CInt(State("myCounter"))myCounter += 1State("myCounter") = myCounterLabel1.Text = myCounter.ToString()End Sub

State 對象是 Page 類(lèi)中各對象的集合,在這個(gè)對象中,您可以對其賦值并在往返過(guò)程中進(jìn)行保存。這成為頁(yè)面的查看狀態(tài)的一部分,實(shí)際上是寫(xiě)在 HTML 中隱西藏域的信息的集合。運行時(shí)屬性發(fā)生變化的控件,也可以在重新處理該頁(yè)時(shí)利用查看狀態(tài)來(lái)恢復這些值。

擁有持續值的一個(gè)更加簡(jiǎn)潔的方法是定義一個(gè)正式的屬性:

        Private Property myCounter() As IntegerGetReturn CInt(State("myCounter"))End GetSetState("myCounter") = valueEnd SetEnd PropertyProtected Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)myCounter += 1Label1.Text = myCounter.ToString()End Sub

您實(shí)際上可以在 State 中加入較為復雜的對象,而依舊使其得到保持。不同于其它簡(jiǎn)單的類(lèi)型,可以存儲許多由通用語(yǔ)言運行時(shí)定義的容器類(lèi)型,例如:ArrayList、 HashtableDataSet 對象。

并非全部得到保存

事情容易搞亂的原因在于,大部分數據在往返過(guò)程中被保存,但不是所有的數據都得到保存。以下是保存與不保存數據的一個(gè)小結。

保存:

  • 頁(yè)面屬性

  • 頁(yè)面中聲明的控件的屬性

  • 已知 Web 控件中的數據,例如 Repeater、 DataList 和 DataGrid

不保存 (除非您自己將其保存):

  • 您加到 Page 類(lèi)中的變量和屬性

  • 掛接在代碼中而未被聲明的事件處理器

  • 在您的代碼中添加或刪除的控件

  • 通過(guò)代碼添加到表中的行和單元格

  • 在使用過(guò)程中進(jìn)行的任何修改

我們已經(jīng)看到如何在 Page 類(lèi)中使用 State 屬性來(lái)饒過(guò)的第一個(gè)問(wèn)題。為了理解剩下的問(wèn)題,有必要先縱覽一下頁(yè)面得到處理時(shí)所發(fā)生的情形。

頁(yè)面處理順序

以下簡(jiǎn)述頁(yè)面處理過(guò)程中發(fā)生的情形:

  1. 創(chuàng )建頁(yè)面和控件:

  2. 從查看狀態(tài)中恢復頁(yè)面和控件的狀態(tài) (只限于回傳):

  3. 根據用戶(hù)輸入更新頁(yè)面控件 (只限于回傳):

  4. 頁(yè)面驗證 (只限于回傳):

  5. 引發(fā)事件:

  6. 頁(yè)面和控件的狀態(tài)保存到查看狀態(tài)中:

  7. 頁(yè)面和控件轉換到 HTML:

  8. 釋放頁(yè)面和控件:

創(chuàng )建頁(yè)面和控件: 每次處理頁(yè)面時(shí) (包括第一次),它將同基于 ASPX 文件內容的控件一起創(chuàng )建。在第一次訪(fǎng)問(wèn) ASPX 文件并修改時(shí),它實(shí)際上轉化為生成的源代碼并編譯成 DLL 文件。由此,訪(fǎng)問(wèn)頁(yè)面是非??斓?,因為不需要進(jìn)行分析,只是執行編譯后的代碼。這些代碼創(chuàng )建控件、設定屬性并同事件掛鉤。

從查看狀態(tài)中獲得頁(yè)面和控件的狀態(tài) (只限于回傳): 如果 ASPX 文件中聲明的控件在您編寫(xiě)的代碼遭到修改,這些修改都將寫(xiě)入查看狀態(tài)中。在第一次訪(fǎng)問(wèn)后的往返過(guò)程中,這些修改被重新應用到已存在的控件。這就是為何在往返過(guò)程中屬性保持不變,但是比較復雜的變化 (如添加事件或添加控件) 則不然。

根據用戶(hù)輸入更新頁(yè)面控件(只限于回傳):基于服務(wù)器的輸入控件能更新其屬性。在 ASP 中,您只能手動(dòng)更新輸入控件,以使其記住用戶(hù)的輸入 (如本例)。因為這一步發(fā)生在大多數事件引發(fā)之前,所以您總是可以查詢(xún)控件 (如 TextBox )的屬性以獲取用戶(hù)錄入的值。

頁(yè)面驗證 (只限于回傳): 如果您使用的是有效的控件,則此時(shí)它們得到驗證。再次,因為這一步發(fā)生在大多數事件引發(fā)之前,您可以可靠地檢查 Page 對象或具體驗證器的有效性。

引發(fā)事件: 這里是您所寫(xiě)代碼的執行部分。第一個(gè)執行的事件是 Page_Load,接著(zhù)執行的是與數據變化有關(guān)系的事件,如 TextBox 的 TextChanged 事件,最后引發(fā)真正導致頁(yè)面回傳的事件,如 Button 的 Click 事件。在第一次訪(fǎng)問(wèn)頁(yè)面時(shí),Page_Load 通常是唯一被執行的事件。

頁(yè)面和控件的狀態(tài)保存到查看狀態(tài)中:任何聲明控件的變化都保存在查看狀態(tài)中,在此之后的變化,如表現時(shí)所執行的任何代碼,都不會(huì )保存到查看狀態(tài)中。

頁(yè)面和控件轉換到 HTML: 第一個(gè)子步驟叫 pre-render ,在此期間完成輸出前所需的各附加步驟。因為它發(fā)生在其它所有事件之后,利用 Page 類(lèi) PreRender 實(shí)際上是一種非常有用的方法,可以用于編寫(xiě)在其它所有事件執行完且在輸出前執行的代碼。下一個(gè)子步驟是 render,此時(shí)才實(shí)際產(chǎn)生 HTML。有一些事件,如 Calendar 的 DayRender 事件直到此時(shí)才實(shí)際執行。同樣,出于 ASP 兼容性目的, <%?>塊內的代碼此時(shí)才被執行。

釋放頁(yè)面和控件: 通用語(yǔ)言運行時(shí)創(chuàng )建和刪除較小的對象時(shí)效率很高,所以創(chuàng )建和刪除這些對象并沒(méi)有太多的性能之憂(yōu)。

與 GUI 開(kāi)發(fā)相比,這種頁(yè)面處理順序看起來(lái)可能有些費解。然而,這個(gè)過(guò)程使對象的壽命減到最小,就有可能建立快速且可以根據大量同時(shí)用戶(hù)進(jìn)行縮放的 Web 應用程序。

了解這個(gè)順序可以幫助您饒過(guò)各種不同的問(wèn)題。例如,順序解釋了為什么在輸出過(guò)程中對對象的進(jìn)行的更改得不到保持的原因。在動(dòng)態(tài)添加事件的情況下,您希望在 Page_Load 中進(jìn)行添加,這樣它們就總可以及時(shí)得到掛接。動(dòng)態(tài)控件有點(diǎn)棘手,我們將在下面進(jìn)行論述。



震撼二: 運行時(shí)添加控件

我們假定您想在一個(gè)表中動(dòng)態(tài)地添加行,您必須借助設計器,在頁(yè)面中放置一個(gè) Table 控件,一個(gè) TextBox 控件以及一個(gè) Button 控件,如圖 2 所示:

圖 2. 帶有 able、 TextBox 和 Button 控件的 Web Forms 設計器

當按鈕被單擊時(shí),我們希望 TextBox 中的內容添加到表的行中去。您可以通過(guò)以下代碼來(lái)實(shí)現:

        Public txtRow As System.Web.UI.WebControls.TextBoxPublic cmdAddRow As System.Web.UI.WebControls.ButtonPublic tbl As System.Web.UI.WebControls.TableProtected Sub cmdAddRow_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)Dim cell As New TableCell()Dim row As New TableRow()cell.Text = txtRow.Textrow.Cells.Add(cell)tbl.Rows.Add(row)End Sub

然而,在往返過(guò)程中,控件本身不能自動(dòng)得到保持,程序將不能按您所期望的那樣運行。通常它將導致表中只有一行,原因是在每次往返過(guò)程中表都被重新建立。如果您想動(dòng)態(tài)地創(chuàng )建控件,您必須手工記錄足夠的信息,以便每次都可以完全重新創(chuàng )建它們。在前述的示例中,您至少需要記住字符串列表。下面這個(gè)可行版本將字符串存儲在查看狀態(tài)中。

        Protected Sub Page_Load(ByVal Sender As Object,ByVal e As EventArgs)Dim s As StringFor Each s In RowTextsAddARow(s)NextEnd SubPrivate Sub AddARow(ByVal s As String)Dim cell As New TableCell()Dim row As New TableRow()cell.Text = srow.Cells.Add(cell)tbl.Rows.Add(row)End SubPrivate ReadOnly Property RowTexts() As ArrayListGetDim o As ArrayListo = CType(State("rowTexts"), ArrayList)If IsNothing(o) Theno = New ArrayListState("rowTexts") = oEnd IfReturn oEnd GetEnd PropertyProtected Sub cmdAddRow_Click(ByVal sender As System.Object,ByVal e As System.EventArgs)RowTexts.Add(txtRow.Text)AddARow(txtRow.Text)End Sub

注意,由于事件的執行次序,有必要將行添加進(jìn) Click 事件和 Page_Load 中。下圖顯示的是運行時(shí)的情況:

圖 3. 運行時(shí)添加行的表

雖然這個(gè)例子主要是增加一個(gè)表,您在運行時(shí)添加或刪除任何控件都將面對同樣的問(wèn)題。并且,當您直接在頁(yè)面中添加控件的時(shí)候,它們可能并不出現在您期望的地方。為了在運行時(shí)定位一個(gè)控件,您至少需要聲明您想放置該控件的父控件。Panel 控件能被用作控件容器。

如果覺(jué)得所有這些太煩瑣,一個(gè)簡(jiǎn)單備選方案就是使用 DataList 或 DataGrid。這些控件將為您創(chuàng )建一個(gè) Table 對象并記住它的狀態(tài)。要了解多信息,請參見(jiàn) Nikhil Kothari 的文章 使用 ASP+ 列表綁定的控件 (英文)。



震撼三: 多頁(yè)面應用

現在您知道頁(yè)面在被處理的時(shí)候是作為對象而存在的,您可能也想到過(guò)創(chuàng )建多頁(yè)面應用程序與此不太一樣。從一個(gè)頁(yè)面調用另一個(gè)頁(yè)面的方法和 GUI 開(kāi)發(fā)中調用一個(gè)頁(yè)面的方法是完全不同的。

作為一個(gè) GUI 開(kāi)發(fā)者,您可能希望創(chuàng )建一個(gè)關(guān)于 Page 類(lèi)的實(shí)例,設置一些屬性,并且將其激活。然而,Web 應用程序并不是那樣工作的 — 一個(gè)頁(yè)面不可以直接訪(fǎng)問(wèn)另一個(gè)頁(yè)面。 ASP 開(kāi)發(fā)者非常熟悉頁(yè)面之間通信的技巧,但 GUI 開(kāi)發(fā)者還有一些知識要學(xué)。

轉移控制

在頁(yè)面之間轉移控制有兩種方法:

  • 超級鏈接: HTML 通過(guò)超級鏈接來(lái)將控制從一個(gè)頁(yè)面轉到另一個(gè)頁(yè)面,可以使用 HTML 語(yǔ)言的 <A>;或使用 HyperLink 控件來(lái)進(jìn)行聲明。使用超級鏈接的優(yōu)點(diǎn)在于可以直接跳轉到新的一頁(yè)而不需要向當前頁(yè)回傳數據。

  • 重新定向: 在服務(wù)器上的一些處理事件的代碼中,您可以調用響應重新定向的功能,并在 RUL 中傳遞 (如上)。例如,在更新數據庫之后進(jìn)行此類(lèi)操作。

這兩種方法均涉及在一個(gè)全球資源定位地址 (URL) 中進(jìn)行傳遞。它們通常是對同一應用程序中的另一個(gè)頁(yè)面的相對參照。您可以通過(guò)在 URL 中嵌入字符串來(lái)在頁(yè)面之間傳遞參數。這些將在下一節中進(jìn)行描述。

傳送信息

Visual Basic 用戶(hù)可能會(huì )尤其覺(jué)得從一個(gè)頁(yè)面向另一個(gè)頁(yè)面傳送信息相當于倒退到 Visual Basic 3.0 甚至更早版本的時(shí)代 — 那時(shí)必須經(jīng)常使用全局數據來(lái)進(jìn)行窗體間通信。這雖然帶來(lái)一定的麻煩,但收益是應用程序可以被數千人同時(shí)使用而不只是一人。

以下是將信息從一個(gè)頁(yè)面傳遞到另一個(gè)頁(yè)面的方法:

URL 參數: 該方法將字符串嵌入 URL 中。例如,要訪(fǎng)問(wèn)同一目錄下的名為 WebForm2.aspx 的頁(yè)面,并且傳送一個(gè)值為“Bar”的參數 “Foo”,您可以使用 URL WebForm2.aspx?Foo=Bar。被調用的頁(yè)面可以用如下代碼來(lái)獲取這個(gè)參數:

            Dim Foo As StringFoo = CStr(Request.QueryString("Foo"))

會(huì )話(huà)狀態(tài):推薦使用這種方法來(lái)保存復雜的或安全性信息。在某些情況下,即使您設計只有一個(gè)頁(yè)面的應用程序,出于安全原因您也應當考慮首先使用 會(huì )話(huà)狀態(tài)而不是查看狀態(tài)。編寫(xiě)代碼時(shí),您可以訪(fǎng)問(wèn) Session 控件,該控件是與用戶(hù)瀏覽器相關(guān)的值的一個(gè)集合。同 State 控件一樣,Session 控件也是借助字符串加以識別的控件集合。類(lèi)似于查看狀態(tài),該控件可以存儲簡(jiǎn)單的類(lèi)型,也可以存儲容器類(lèi)型,諸如 Array、 ArrayList、 HashtableDataSet。

應用程序狀態(tài):為了保存和讀取有關(guān)您的應用程序的所有當前用戶(hù)的信息,請使用 Application 控件,它是一個(gè)和會(huì )話(huà)狀態(tài)和查看狀態(tài)有著(zhù)同樣接口的控件。

關(guān)于安全性的說(shuō)明

因為 Web 在很大程度上是不安全的,所以在您的應用程序中導致安全漏洞是很容易的事情 (令人不安)。您應當意識到哪些是安全的,哪些是不安全的。

查看狀態(tài)和 URL 參數兩者均不安全: 有些人不僅可以比較容易地看到這些值,有些人還可能將其修改后再傳。您應當確信這些值中不含有涉及安全的信息,并且您的數據不會(huì )因為有人改變這些值而遭到破壞。

會(huì )話(huà)狀態(tài)和應用程序狀態(tài)是安全的: 因為它們存在于服務(wù)器上并且是隱蔽的。除非您用代碼加以允許,否則黑客是不可能修改這些值的。安全信息應儲存于會(huì )話(huà)狀態(tài)或應用程序狀態(tài)中。

驗證是安全的: 這是因為驗證檢查總是在服務(wù)器上再次執行,即使有人想在客戶(hù)機上將其饒過(guò)。服務(wù)器驗證是一種安全機制,也是針對客戶(hù)機驗證的一種后退機制。



震撼四: 數據綁定

令人驚嘆的是數據綁定不再是一個(gè)討厭的字眼了。 在傳統的 GUI 編程中,數據綁定經(jīng)常導致失敗。Visual Basic 程序員首先應了解: 數據綁定所帶來(lái)的麻煩往往要比其自身的價(jià)值大。您在使用它創(chuàng )建一個(gè)實(shí)實(shí)在在的應用程序時(shí)可能會(huì )經(jīng)常遇到麻煩。這主要用于無(wú)須事務(wù)控制的原型開(kāi)發(fā)、報表和數據錄入。

ASP+ 數據綁定對于實(shí)際的商務(wù)應用程序是非常有用的,具有諷刺意味的是,其原因它所具有的特性較少。ASP+ 數據綁定和傳統的 GUI 數據綁定有以下兩點(diǎn)顯著(zhù)不同:

  • 它是顯式的:您可以通過(guò)訪(fǎng)問(wèn) Page 類(lèi)的 DataBind 方法或數據綁定控件來(lái)實(shí)現數據綁定。傳統的數據綁定是自動(dòng)執行的,從而不易于控制。

  • 它是單向的:在典型的商用事務(wù)中,數據綁定非常適用于從數據庫中獲得數據,但是通常您想進(jìn)行許多定制過(guò)程或調用所存儲的函數或業(yè)務(wù)對象來(lái)完成更新。因為在錯誤的時(shí)間自動(dòng)更新數據通常會(huì )產(chǎn)生問(wèn)題,所以數據綁定將從數據源提取信息,但又由您去進(jìn)行更新。您這使您擁有很多控制能力,同時(shí)依舊可以用于報表和原型開(kāi)發(fā)。

數據綁定模型的另一個(gè)優(yōu)點(diǎn)是它可以用于內存中一些簡(jiǎn)單信息,如結構數組。在 Visual Basic 中,根據數據來(lái)源 (內存或數據庫) 的不同,數據綁定的控件通常有兩種截然不同的工作方式。在通用語(yǔ)言運行時(shí)中,數據綁定通過(guò)低級接口起作用,因此,對簡(jiǎn)單數據結構的處理方式,與對來(lái)自傳統數據庫的數據的處理方式是相同的。



結論

如您所見(jiàn),Web 開(kāi)發(fā)和 GUI 開(kāi)發(fā)是兩個(gè)完全不同的事情。本文旨在幫助您在兩者之間轉換時(shí)避免一些最容易犯的錯誤。理解概念性模式,可能有助于您解決大部分可能遇到的困難。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
總結3:和頁(yè)面相關(guān)的問(wèn)題
最新技術(shù): ASP.NET 頁(yè)的客戶(hù)端
asp.net 基礎概述
Asp.net程序性能優(yōu)化的七個(gè)方面
利用 ASP.NET、JavaScript 和 OLE DB 從頭設計您自己的網(wǎng)絡(luò )日記應用程序
提高網(wǎng)站速度:ASP.NET緩存詳解-程序開(kāi)發(fā)-紅黑聯(lián)盟
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久