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

首頁 > 編程 > .NET > 正文

漫談ASP.NET 頁面對象模型

2024-07-10 12:54:57
字體:
來源:轉載
供稿:網友
摘要:

  本文討論關于建立asp.net web頁的事件模型和轉化為html的各個過程的細節。asp.net http 運行時管理著把請求url轉換成一個頁面類的具體實例的對象管道,接下來把這些實例轉換成一般的html文本格式。本文對代表各個頁面生命周期的事件、怎么控制頁面執行、開發人員怎么干預這些標準行為的執行過程進行了講解。
  介紹

  每當請求iis容納的asp.net頁時,總是要把請求轉交給了asp.net http 管道。http管道是一組被控對象,這些對象按順序處理請求并且把這些請求轉換成一般html文本。http管道的入口是httpruntime 類。asp.net的底層結構為每一個應用程序域 ( appdomain )的工作進程建立了一個這個類(httpruntime)的實例(注意,一個工作進程只能支持一個正在運行的asp.net應用域)。

  httpruntime 類從內部程序池中選擇一個 httpapplcation 對象,并且在接收到請求的時候使它工作。http應用管理程序的主要工作是尋找這樣的類使之能夠處理請求。例如:當請求一個.aspx資源時,處理句柄就是一個從page繼承類的實例。請求資源的類型和相關處理句柄的關系映射表被保存在應用程序的配置文件里。更確切的說,這個映射表就定義在machie.config里的<httphandlers>一節里。但是,應用程序能在web.config里對這個http處理句柄映射列表進行重定義。下面這行語句說明了定義.aspx資源請求的處理句柄:

<add verb=”*” path=”*.aspx” type=”system.web.ui.pagehandlerfactroy”/>

  一個擴展可以和一個句柄類聯系起來,更一般說,是和一個句柄工廠類相聯系。在所有情況下,負責處理請求的httpapplication對象得到一個從ihttphandler接口具體實現的對象。如果是根據http句柄來處理資源和相關處理類的關系,則返回類是直接實現相關的接口的;如果資源是綁定到一個句柄工廠的話,將必須經過另外一個階段:具體實現ihttphandlerfactory接口的句柄工廠類的gethandler方法將返回一個基于ihttphandler的對象。

  http運行時怎么結束一個周期或關閉一個頁面請求的進程呢?ihttphandler接口的processrequest方法擁有這個功能。調用代表被請求頁面的對象的該方法,asp.net底層結構打開一個進程來為瀏覽器產生輸出。

  page類

  一個頁面的http處理句柄的類型取決于url。當這個url被首次訪問,一個新的類將被構建并動態的編譯成一個程序集。一個分析aspx文件的進程從aspx文件中分離出這個類的代碼。在默認情況下,這個類被加入到一個叫做asp的名字空間里,并且把url作為這個類的類名。例如,如果請求的url是page.aspx,則這個類就是asp.page_aspx。這個類名,可以通過設置@page預處理指令的classname屬性來修改。

  http句柄的基礎類是page類。這個類定義了一組最小方法和屬性集,這些方法和屬性被所有的頁面處理句柄所共享。page類具體實現了ihttphandler接口。

  在另外一種和上述相對應的情況中,實際處理頁面的句柄的基礎類并不是page類,而是一個別的類。當使用后代碼模式時,這個情況就發生了。后代碼是一種將c#或vb.net代碼和頁面分離的技術。頁面代碼是一組事件處理句柄和其他一些方法的集合,這些方法定義了頁面的各種行為。這些代碼可以以內聯形式用<script runat=server>標簽定義,或者你可以用外部類形式來寫——這就是后代碼模式。后代碼類是從page類繼承的,但是具體化或者重新定義了一些其他的方法。在指定了頁面的后代碼類后,這個后代碼類就作為http處理句柄。

  在其他的情況下,如果應用程序的配置文件中重定義了<pages>節的pagebasetype屬性,則http處理句柄不是基于page類的,例如:

<pages pagebasetype = “classes.myoage , mypage” />

  pagebasetype屬性指明了包含頁面處理句柄父類的類型和程序集。來自page類的這些類自動賦予一些通?;驍U展的方法和屬性的集合給處理句柄。



  頁面生命周期

  一旦http頁面處理句柄被明確的定義了,asp.net運行時調用處理句柄的processrequest方法來處理請求。通常,沒有必要改變page類提供的執行方法。

  頁面執行是從frameworkinitialize方法開始的,這個方法為頁面構建控件樹。該方法是templagecontrol類的受保護并且是虛方法。任何為aspx資源動態生成的句柄覆蓋了該方法。在這個方法里,頁面的所有控件樹都被構建了。

  接下來,processrequest方法使頁面經歷了不同的幾個階段:初始化、加載視圖狀態信息、回傳數據、加載頁面代碼和執行回傳的服務器事件。在這之后,頁面轉換到了顯示模式:收集被更新的視圖狀態;產生html代碼,并且傳送到控制臺。最后,頁面卸載,請求的全部服務結束了。

  在各個不同階段里,頁面處理了與web控件相關、程序員代碼能夠干預并解決一定問題的事件。其間一些事件是專門為那些內嵌控件和不能在.aspx代碼級別處理的控件而設計的。

  一個頁面要解決這樣的事件,它能明確的注冊成為合適的句柄。但是,為了和原有的visual basic編程模式有后向兼容性,asp.net也支持了隱含事件的形式。在默認情況下,頁面會尋找和事件相關的方法名;如果找到和事件相匹配的方法,這個方法就被認為是這種事件的處理程序。asp.net提供了六種專門的方法名,他們是 page_init , page_load , page_databind , page_prerender 和 page_unload 。這些方法這些方法在page類中已經被定義過,他們是相應事件的處理程序。http運行時將自動的將這些方法綁定到相關的頁面事件,而不需要程序員去編寫把事件和方法聯系起來的代碼。舉個例子來說,在下面的代碼中, page_load方法和頁面的加載事件相關聯:

this.load + = new eventhandler(this.page_load);

  這種自動識別是被 @page 預指令的autoeventwireup 屬性控制的。如果這個屬性被置false ,應用程序必須顯式聲明和事件相關的方法。不自動關聯頁面事件代碼的頁面執行起來會快一些,是因為他們不需要在匹配上做過多的工作。在visual studio.net 工程里可以把這個屬性關閉掉。但是,默認設置是true,這意味著page_load方法被自動識別并被關聯到相關的事件。

  頁面執行包含了下表中按順序列出的幾個階段,他們被標志成為應用程序級別的事件,同時也可能是一些受保護、重定義的方法:

階段頁面事件可重定義的方法頁面初始化init 視圖狀態加載 loadviewstate回傳數據處理 控件里實現了ipostbackdatahandler接口的loadpostdata方法頁面加載load 回傳數據變化檢查 控件里實現了ipostbackdatahandler接口的raisepostdatachangedevent方法回傳事件處理控件里定義的回傳事件控件里實現了ipostbackeventhandler接口的raisepostbackevent方法頁面預返回階段prerender 頁面返回階段render 頁面卸載階段unload   
  上表中列出的階段有的在頁面級別是不可見的,他們只是在服務器控件的作者編寫繼承于page的類時會使用到。init , load , prerender , unload,再加上定義在內嵌控件中的回傳處理事件,他們構成了頁面的整個生命周期。

  各個階段的執行

  頁面生命周期的第一階段是初始化。這個階段被init事件所描述,這個事件在控件樹被構建出來后執行。換句話說,當init事件發生時,所有在.aspx文件中靜態聲明的控件被實例化并被賦予了默認值。在init事件中可以初始化任何的在頁面生命周期里需要的設置。例如:在這個階段,控件可以加載外部的摸版文件或者是為事件建立處理句柄。需要注意的是,任何的視圖狀態信息在這個階段里是不能用的。

  緊接著初始化結束后,頁面構架為頁面加載視圖狀態。視圖狀態是 名稱/值 對的集合,控件或頁面在這里保存的數據在整個web請求過程中必須是穩固的。視圖狀態代表著頁面的上下文。典型的,它保存著頁面上次在服務器上被執行時控件的狀態。視圖狀態在會話開始的第一個頁面請求時是空的。在默認情況下,試圖狀態被保存在一個隱藏域里,這個隱藏域是被自動添加到頁面里的。這個隱藏域的名稱是 __viewstate。如果覆蓋了loadviewstate方法——在control類里被聲明為受保護的方法——組件開發者可以控制視圖狀態的保存和它是如何和內部狀態形成映射。

  象loadpagestateformpersistencemedium這樣的方法和與其相對應的savepagestatetopersistencemedium方法可以用來加載或者保存視圖狀態到其他的存儲中介里,例如:會話、數據庫或者是服務器上的文件。和loadviewstate方法不相同的是,上面提到的方法只能在page的繼承類里使用。

  一旦視圖狀態加載完畢了,頁面里的控件被賦予了和上一次發送到瀏覽器時一樣的狀態。下一個階段是將他們更新,使之與服務器端發生的變化相一致。在回傳數據處理階段,控件更新他們的狀態,使之和客戶端的html元素的狀態相一致。例如,服務器控件textbox有和它相對應的html控件<input type=text>。在回傳數據階段,textbox控件將得到<input>標簽的值,并且用他來更新他的內部狀態。每一個控件都可以從回傳數據中取得自己數據的能力,并且把自己的狀態更新。textbox控件將更新它的text屬性,同樣的,checkbox控件也會將他們的checked屬性刷新。服務器控件和html元素的匹配是通過兩者的id來進行的。

  在回傳數據處理的最后階段,所有的頁面控件反映了上一個被更新的狀態,這些都是由于客戶端的輸入變化所引起的。接下來,load事件將被頁面執行。

  有一些控件,在兩次請求中如果某些敏感屬性發生了變化,他們需要對此作出響應,并且完成一定的任務。例如,如果客戶端的textbox控件的文本發生變化,這個控件就激發了textchanged事件。根據自客戶端的數據,如果控件的一個或多個屬性發生了變化,每一個控件都可以精確的激發合適的事件來處理。這些控件實現了ipostbackdatahandler接口,這個接口中的loadpostdata方法在load事件之后就被執行了。通過重定義loadpostdata方法,控件可以驗證兩次請求中發生的變化并且激起相關的事件處理程序。

  在一個頁面周期中的關鍵事件是那些由客戶端事件激發在服務器執行一段代碼的事件。例如,當用戶點擊一個按鈕,頁面就需要回傳。這個事件的處理是從按鈕id和值的收集開始的。如果控件是實現了ipostbackeventhandler接口(button和linkbutton就是這樣的情況),頁面構架將調用raisepostbackevent方法。這個方法的具體情況是取決于控件的類型的。在上面提到的button和linkbutton控件,這個方法就將尋找click事件處理程序。

  處理了回傳事件之后,頁面就準備被發送出去了。這個階段是從prerender事件開始的。這對于控件來說,那些需要在視圖信息被保存與結果被發送之前這段時間里執行的動作,這是一個很好的時機。下一步就是saveviewstate ,所有的空間和頁面本身就把視圖狀態的集合內容保存起來。接下來,視圖狀態被串行化、哈希編碼、base64 編碼,并且保存在__viewstate隱藏域里。

  各個控件的發送機制可以通過重定義render方法來改變。這個方法構建了一個html writer對象,用它來為控件產生html代碼。對page類里render方法的默認執行包含了對所有成員控件的遞歸調用。頁面為每一個控件調用一次render方法,并緩沖html輸出。

  頁面生命周期的最后階段是卸載事件,這個事件在頁面對象消失前被激發。在這個事件里,你應該把任何臨界資源釋放掉(例如:文件、圖形對象、數據庫連接)。

  最后,瀏覽器接收到了http響應,并且把頁面顯示出來。

  總結

  asp.net頁面對象模型是一個有特點的新穎的模型,因為它是基于事件機制的。一個web頁由一些控件組成,這些控件擁有豐富的基于html的用戶接口,同時通過事件和用戶進行交互。在web應用程序上下文環境中構建一個事件模型是富有挑戰性的。使客戶端產生的事件和服務器上的代碼關聯起來是令人驚異的,這個過程是輸出同html也一樣是可見的,只不過他們在需要的時候被恰當的修改。

  要了解頁面生命周期的各個階段、頁面對象是怎樣實例化并被http運行時所使用,掌握這個模型是很重要的。
,歡迎訪問網頁設計愛好者web開發。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大同市| 五台县| 威信县| 黔西县| 静乐县| 蓬溪县| 大埔区| 涪陵区| 黄梅县| 神木县| 浠水县| 科技| 南陵县| 红原县| 贺州市| 江津市| 广德县| 阜阳市| 朝阳区| 于田县| 怀远县| 绥德县| 望江县| 汉中市| 赫章县| 德化县| 龙里县| 石楼县| 贞丰县| 磴口县| 龙州县| 广元市| 扎鲁特旗| 连城县| 万载县| 崇明县| 太湖县| 蓝田县| 吉首市| 临澧县| 集安市|