如果用靜態/動態這個角度去分析乙個.aspx檔案,可以將其分成兩部份:一部份是靜態的連續的文字,如:……< body>;另一部份是動態的特殊標籤,如:。兩者以是否擁有屬性runat=」server」為判斷標準。asp.net將後一部份稱之為伺服器控制項,程式設計師以伺服器控制項為物件模型來定義web應用程式的使用者介面,控制使用者互動;而前一部份在執行時也將被建立成一種特殊的控制項——literalcontrol。
如果用asp面向過程的方法來處理所謂的伺服器控制項,就是根據使用者的需求直接生成對應的html**;而在asp.net中,程式設計師與html**被抽象的物件導向的伺服器控制項概念隔離開來。既然物件導向,伺服器控制項就應該擁有屬性(property)來描述自己的狀態;用方法(method)描述自己的動作;需要事件(event)來觸發方法,改變狀態,最後自動生成相應的html**。當然我們不需要從頭來構架這個模型,所有的伺服器控制項,包括page類,都直接或間接繼承於system.web.ui.control類,而顯示為html表單元素的控制項,往往又繼承於system.web.ui.webcontrol類,稱為web控制項。下例是乙個簡單的自定義控制項範例,訪問該例的testmycontrols.aspx頁,檢視源**會發現控制項對應的html**為「1」。
自定義控制項集
using
system;
using
system.web.ui;
namespace
essay
set}
//重寫control.render方法,生成控制項對應的html**
protected
override
void
render(htmltextwriter writer)}}
頁面檔案,註冊自定義控制項集
//在頁面增加自定義控制項並將屬性number值設為-1
@ register tagprefix="
mc"namespace="
essay
"assembly="
essay
"%>
<
html
><
head
>
head
><
body
>
<
form runat="
server
">
<
mc:myfirstcontrol id="
test1
"number="
-1"runat="
server
"/>
form
>
body
>
html
>
■ 葛玲是誰? – 伺服器控制項的狀態保持
若干年前有乙個火腿腸廣告,對話如下:
呂麗萍:冬寶,在想啥呢?
葛 優:想葛玲
呂麗萍:別想了,我給你介紹一位新朋友——dudu牌火腿腸
呂麗萍:(過一會兒)還想葛玲嗎?
葛 優:葛玲是誰?
人機互動設計的乙個重要內容是互動工作流,而實現互動工作流的前提是狀態保持,否則就會出現「葛玲是誰」這樣的幽默。控制項可以利用傳統的cookies、session、隱藏控制項等方法來儲存狀態值,在《隨想八》中我們已經**過檢視狀態(viewstate)的作用和原理,本質上,asp.net創造出的有狀態、連續的頁面狀態保持機制是通過頁面隱藏資料。接下來我們通過改造上例進一步研究利用檢視狀態來完成控制項狀態保持的細節。
自定義控制項集
……public
class
myfirstcontrol:control
//增加屬性numberinviewstate,用以訪問屬性number的檢視狀態值
public
intnumberinviewstate
set}
protected
override
void
render(htmltextwriter writer)}……
頁面檔案
<
html
>
……@ page language="
c#"%>
<
script runat="
server
">
protected
override
void
onload(eventargs e)
script
>
<
form runat="
server
">
<
mc:myfirstcontrol id="
test1
"runat="
server
"/>
<
input type="
submit
"/>
form
>
body
>
html
>
■ 換杯子還是換粉圓? – 控制項樹與伺服器控制項的生命週期
在執行期,頁面框架會在杯子裡放入指定的伺服器控制項類例項,當然它們不是胡亂堆積在一塊,而是組合成一顆控制項樹,圖10-2為例2的頁面控制項樹模型,我們可以通過控制項的id或在樹中的位置控制控制項,也可以增加或刪除控制項。
在假想的有狀態、連續的頁面前提,意味著在初始請求後,頁面必須儲存每乙個控制項的狀態,在回傳(postback) 後,首先是恢復控制項原來的狀態,再處理新的請求。也就是說,每乙個客戶端對同乙個頁面的連續n次請求,相當於向奶茶鋪連續要了n杯同一品種的奶茶,第一杯珍珠奶茶中粉圓狀態是預設的,從顧客提出第二杯奶茶請求起,夥計必須先把這杯中粉圓狀態撥弄成與端給顧客時的上一杯狀態一模一樣,然後根據顧客新的事件進行調整。如圖10-2。詳細過程請查閱msdn的《控制項執行生命週期》。
這種無中生有的互動工作流實現方法是要付出代價的,作為程式設計模型而言,程式設計師可以在伺服器控制項的抽象概念上輕鬆實現,但對整個系統的效能而言,asp.net並未對客戶端和伺服器端做過多少負載均衡優化,用合金槍頭的話來說,「如果就連選擇籍貫省市的下拉框都要用伺服器控制項來提交一下,同時重新整理頁面的話,那的確很噁心」。
乙個很自然的想法是為什麼對每一次請求我們都要把整個杯子換掉呢?如果僅僅是換掉幾個粉圓和一小部份奶茶,將大大改善系統效能,這就是ajax技術的出發點。
伺服器控制項
本章學習了asp.nte頁面的乙個核心構造塊 伺服器控制項。伺服器控制項是一種用於頁面開發的物件導向方法,它把頁面元素封裝到可修改和可擴充套件的元件中。伺服器控制項型別包括 web伺服器控制項和html伺服器控制項 web伺服器控制項的2個特點 必須有id和runat server html元素加上...
伺服器模型
伺服器模型 1 迴圈伺服器模型 tcp 迴圈伺服器 udp 迴圈伺服器 2 併發伺服器 tcp 併發伺服器 父子程序實現併發伺服器 父親程序 接收請求。accept 兒子程序 處理具體客戶端需求。send recv 注意點 殭屍程序,父親活著,兒子死亡,父親沒有為兒子程序收屍,會產生殭屍程序。避免殭...
伺服器模型
在使用socket進行網路程式設計時,首先要選擇乙個合適的伺服器模型是很重要的。在網路程式裡,通常都是乙個伺服器服務多個客戶機,為了處理多個客戶機的請求,伺服器端的程式有不同的處理方式。迭代模型算是最早期的伺服器模型,其核心實現是每來乙個使用者,然後為這個使用者服務到底,過程中不接受任何新的使用者請...