ASP。NET中共有幾種類型的控件?
三種:1-asp.net控件(動(dòng)態(tài)) 2-標(biāo)準(zhǔn)的html控件(靜態(tài)) 3-標(biāo)準(zhǔn)的html控件加runat="server"屬性(動(dòng)態(tài))
動(dòng)態(tài)頁(yè)面主要由這三種控件畫(huà)出來(lái)。從數(shù)據(jù)庫(kù)獲取到數(shù)據(jù)后把數(shù)據(jù)綁定到這些控件上發(fā)給瀏覽器顯示出來(lái)。把數(shù)據(jù)綁定到控件屬性的時(shí)候有兩個(gè)重要的方法
Eval("字段")
Bind("字段")
Eval("字段")方法只是把數(shù)據(jù)綁定到數(shù)據(jù)控件上,并不提供修改的操作。
Bind("字段")方法是把數(shù)據(jù)綁定到數(shù)據(jù)控件上,并提供修改的操作。
●ASP。NET中共有幾種類型的控件?
兩種:
1. 客戶端控件,也就是我們?cè)贖TML中經(jīng)常用到的
2. 服務(wù)端控件,例如: <asp:TextBox ID="txt" runat="server" />
客戶端控件也可以轉(zhuǎn)成服務(wù)端控件
<input type="text" id="txt" runat="server" />
他們的區(qū)別?
1.
編譯 ASP.NET 應(yīng)用程序時(shí),具有 runat=server 屬性的 HTML 服務(wù)器控件被編譯為程序集??上雋tml控件在客戶端也要在內(nèi)存中生產(chǎn)一個(gè)dll,并加到dom模型中。這樣js就能編輯它了。
2.
區(qū)別:服務(wù)器端控件都會(huì)有個(gè)runat="Server"屬性,
這樣才能夠在后臺(tái)對(duì)其進(jìn)行設(shè)置修改,
也就是在cs代碼里面能對(duì)其修改設(shè)置。
你做下測(cè)試 你放個(gè)HTML控件 在CS代碼是引用不出控件名的
然后你個(gè)HTML控件加上runat="Server" 在CS代碼就能引用該控件了
本質(zhì)上ASP.NET 的服務(wù)器控件 解析后返回到前臺(tái)還是HTML控件
你建個(gè)頁(yè)面 放一個(gè)asp:textbox上去
然后運(yùn)行頁(yè)面,然后查看頁(yè)面源文件
你會(huì)發(fā)現(xiàn)放上的服務(wù)器控件變成了HTML的inupt type="button"
至于你說(shuō)的視圖狀態(tài)應(yīng)該是說(shuō)這個(gè)吧:
由于HTTP連接屬于無(wú)狀態(tài)的,每次頁(yè)面請(qǐng)求都無(wú)法記錄上次請(qǐng)求頁(yè)面的信息。
那么要保存上次請(qǐng)求頁(yè)面上控件的值,也就是頁(yè)面刷新后,填寫(xiě)的值不變,比方在textbox填了個(gè)‘a(chǎn)’,頁(yè)面刷新后還是'a',.NET框架為實(shí)現(xiàn)這種機(jī)制,于是就用到了viewstate視圖狀態(tài)來(lái)保存這些控件的值,
那么將所有控件的值存在什么地方呢?你可以運(yùn)行你的程序,然后在頁(yè)面中查看源文件,就可以看到一個(gè)input type="hidden" name="__VIEWSTATE"的標(biāo)簽,這個(gè)就是你所謂的”視圖“,它是經(jīng)過(guò)服務(wù)器序列化過(guò)的,然后服務(wù)器接收后會(huì)反序列化這些隱藏域的值然后又從新給這些控件賦值,從而頁(yè)面刷新后還能記錄上次請(qǐng)求時(shí)候的所有控件的值。服務(wù)器控件都會(huì)默認(rèn)保存VIEWSTATE的 有個(gè)屬性(EnableViewState)可以設(shè)置的, 設(shè)置為Flase就不保存了,頁(yè)面刷新后,值也就沒(méi)了,可以做個(gè)測(cè)試放個(gè)textbox設(shè)置為EnableViewState為false,然后輸入個(gè)值,然后再用按鈕去刷新頁(yè)面,那么textbox會(huì)為空,因?yàn)闆](méi)有視圖狀態(tài)記錄到上次你輸入的值。
3.
asp.net控件是服務(wù)端控件
響應(yīng)服務(wù)端事件
HTML控件是客戶端控件
響應(yīng)客戶端事件
如果你對(duì)服務(wù)端/客戶端不明白的話先去了解一下
簡(jiǎn)單來(lái)說(shuō)
HTML客戶端的事件是不會(huì)提交給服務(wù)端的
比如說(shuō)點(diǎn)擊一個(gè)按鈕 改變文字的顏色
只是針對(duì)用戶機(jī)器本身的 不會(huì)發(fā)送數(shù)據(jù)包給遠(yuǎn)程的服務(wù)器
而asp.net按鈕點(diǎn)擊后
將會(huì)以post或者get形式發(fā)送給服務(wù)器
進(jìn)行數(shù)據(jù)庫(kù)操作等等 頁(yè)面提交后將會(huì)刷新
但是ajax技術(shù)可以使客戶端控件發(fā)送請(qǐng)求給webservice
具體的用法
如果強(qiáng)調(diào)客戶端的 應(yīng)用
用客戶端控件更能使用戶感覺(jué)到方便
不用刷新頁(yè)面
而需要數(shù)據(jù)庫(kù)等操作時(shí) 肯定要用服務(wù)端控件
但是沒(méi)有絕對(duì)的
我現(xiàn)在做的項(xiàng)目就是兩者結(jié)合用
4.
web服務(wù)器控件并非只是運(yùn)行在服務(wù)器端這么簡(jiǎn)單,它是.NET中封裝好的組件,每個(gè)控件都是一個(gè)對(duì)象,屬于某個(gè)基類,有自己的屬性,事件和方法.由在.net framework下執(zhí)行.
而HTML只是普通的HTML標(biāo)記,就算加上runat=server也沒(méi)有服務(wù)端控件那么強(qiáng)大的方法,只是有簡(jiǎn)單的屬性和事件而已.HTML控件有runat=server后在服務(wù)器端加載,可以通過(guò)服務(wù)器端操縱這個(gè)控件,比如賦value值.和真正的Web服務(wù)器控件還差的很遠(yuǎn).充其量只能算是一行代碼.
5.
設(shè)置為服務(wù)器控件可以通過(guò)頁(yè)面.cs文件使用,它的值都可以在后臺(tái)得到。
<input type="text" id="txt1" value="" runat="server" />
這樣你在后臺(tái)可以通過(guò)this.txt1.Value來(lái)獲取到文本框中的值。
標(biāo)準(zhǔn)的服務(wù)器控件是<asp:TextBox runat="server" ID="TextBox1" ></TextBox>
它在后來(lái)的使用是this.TextBox1.Text而不是.Value
6.
因?yàn)榉?wù)器要用這些控件呀。
HTML控件是從HTML標(biāo)記衍生來(lái)的,HTML控件的外形與HTML標(biāo)記相似,不同之處在于:HTML標(biāo)記只能在客戶端瀏覽器中使用,服務(wù)器無(wú)法使用。
服務(wù)器通常要把控件中的數(shù)據(jù)或存于數(shù)據(jù)庫(kù)中,或做些改變重新發(fā)回去等事情。 如果不設(shè)置為服務(wù)器控件,服務(wù)器就不能使用它。
7.
Asp.net之所以方便和強(qiáng)大,關(guān)鍵是它有一組強(qiáng)大的Asp.net服務(wù)器控件,在Asp.net中我們經(jīng)常會(huì)遇到Html控件,Html服務(wù)器控件、Web控件和Asp.net服務(wù)器控件。
Html控件:就是我們傳統(tǒng)所說(shuō)的Html 超文本標(biāo)記語(yǔ)言,這些Html控件在以往的靜態(tài)網(wǎng)頁(yè)或網(wǎng)頁(yè)里即可滿足我們的需求,Html控件并沒(méi)有辦法利用程序直接來(lái)控制它們的屬性、使用方法和接收事件,我們必須另外學(xué)習(xí)其它如JavaScript 等程序語(yǔ)言才得以控制。如:<input id="Button1" type="button" value="button" />。
Html服務(wù)器控件:就是上面我們講的Html控件的屬性里加上runat="server"所構(gòu)成的控件,至于Html控件和Html服務(wù)器控件之間的區(qū)別很明顯,Html服務(wù)器控件是運(yùn)行于服務(wù)器端,Html控件是運(yùn)行于客戶端。具體來(lái)說(shuō):當(dāng)ASP.NET 網(wǎng)頁(yè)執(zhí)行時(shí),會(huì)檢查標(biāo)注有無(wú)runat 屬性,如果標(biāo)注沒(méi)有設(shè)定,那么Html控件就會(huì)被視為字符串,并被送到字符串流等待送到客戶端,客戶端的瀏覽器會(huì)對(duì)其進(jìn)行解釋;如果Html控件有設(shè)定runat="server" 屬性,Page 對(duì)象會(huì)將該控件放入控制器,服務(wù)器端的代碼就能對(duì)其進(jìn)行控制,等到控制執(zhí)行完畢后再將Html服務(wù)器控件的執(zhí)行結(jié)果轉(zhuǎn)換成Html標(biāo)注,然后當(dāng)成字符串流發(fā)送到客戶端進(jìn)行解釋。如:<input id="Button1" type="button" value="button" runat=”server” />。
Asp.net服務(wù)器控件:也叫Web服務(wù)器控件,Asp頁(yè)面中用來(lái)定義Web應(yīng)用程序用戶界面的組件,是Web Forms編程模型的基本元素,它會(huì)依Client的情況生產(chǎn)一個(gè)或者多個(gè)Html控件,而不是直接描述Html元素。如<asp:Button ID="Button2" runat="server" Text="Button" />。那它和Html服務(wù)器端控件有什么區(qū)別,以及它有什么新的特點(diǎn)呢?
1、 Asp.net服務(wù)器控件提供更加統(tǒng)一的編程接口,如每個(gè)Asp.net服務(wù)器控件都有Text屬性。
2、 隱藏客戶端的不同,這樣程序員可以把更多的精力放在業(yè)務(wù)上,而不用去考慮客戶端的瀏覽器是ie還是firefox,或者是移動(dòng)設(shè)備。
3、 Asp.net服務(wù)器控件可以保存狀態(tài)到ViewState里,這樣頁(yè)面在從客戶端回傳到服務(wù)器端或者從服務(wù)器端下載到客戶端的過(guò)程中都可以保存。
4、 事件處理模型不同,Html標(biāo)注和Html服務(wù)器控件的事件處理都是在客戶端的頁(yè)面上,而Asp.net服務(wù)器控件則是在服務(wù)器上,舉例來(lái)說(shuō):
<input id="Button4" type="button" value="button" runat="server"/>是Html服務(wù)器控件,此時(shí)我們點(diǎn)擊此按鈕,頁(yè)面不會(huì)回傳到服務(wù)器端,原因是我們沒(méi)有為其定義鼠標(biāo)點(diǎn)擊事件。
<input id="Button4" type="button" value="button" runat="server" onserverclick="test" />我們?yōu)镠tml服務(wù)器控件添加了一個(gè)onserverclick事件,點(diǎn)擊此按鈕頁(yè)面會(huì)發(fā)回服務(wù)器端,并執(zhí)行test(object sender, EventArgs e)方法。
<asp:Button ID="Button2" runat="server" Text="Button" />是Asp.net服務(wù)器控件,并且我們沒(méi)有為其定義click,但是我們點(diǎn)擊時(shí),頁(yè)面也會(huì)發(fā)回到服務(wù)器端。
由此可見(jiàn):Html標(biāo)注和Html服務(wù)器控件的事件是由頁(yè)面來(lái)觸發(fā)的,而Asp.net服務(wù)器控件則是由頁(yè)面把Form發(fā)回到服務(wù)器端,由服務(wù)器來(lái)處理。
以上是我們對(duì)Asp.net里的控件進(jìn)行了簡(jiǎn)單的介紹,我們通常說(shuō)的Web控件也就是指Asp.net服務(wù)器控件。
5.
1.一個(gè)網(wǎng)頁(yè)里可以劃分為兩部分:
1.1一部分是固定不變的(沒(méi)有runat=server)
這一部分的在ASP.Net中是逐字輸出的,在空間樹(shù)中有Literal控件直接生成,在頁(yè)面中不能對(duì)其進(jìn)行修改,因?yàn)樗鼪](méi)有自己對(duì)應(yīng)的對(duì)象實(shí)例
1.2一部分是變化的(runat=server)
這一部分在ASP.Net中首先會(huì)生成一個(gè)對(duì)應(yīng)的對(duì)象實(shí)例,通過(guò)這個(gè)對(duì)象實(shí)例在頁(yè)面中可以對(duì)其進(jìn)行修改,這種控件叫做服務(wù)器控件,但是這種控件又分為兩種:
1.2.1一種是System.Web.UI.HtmlControls命名空間下的控件,這種控件可以在后綴名為aspx和htm文件下使用
1.2.2一種是System.Web.UI.WebControls命名空間下的控件,這種控件可以在后綴名為aspx文件下使用
2.由上面的內(nèi)容可知,一個(gè)頁(yè)面程序在執(zhí)行時(shí),其實(shí)是把一個(gè)頁(yè)面文件轉(zhuǎn)換為一個(gè)類的實(shí)例,這個(gè)類就是頁(yè)面類(Page),這個(gè)類有個(gè)Controls的屬性,通過(guò)它可以得到一個(gè)ControlCollection類型的對(duì)象,這個(gè)對(duì)象包含了該頁(yè)面下的所有控件(由上面的劃分方法獲得),而頁(yè)面下的控件也有ControlCollection屬性,也包含有子控件,由此就構(gòu)成了一個(gè)控件樹(shù)。此控件樹(shù)可以在頁(yè)面命令里把Trace設(shè)置為True時(shí)看到。
---------------------asp.net關(guān)于控件and控件事件的個(gè)人總結(jié)----------------------------
1.關(guān)于控件
asp.net一共有兩種控件一種是服務(wù)器端控件,會(huì)在服務(wù)器端生成對(duì)應(yīng)的類實(shí)例,運(yùn)行在服務(wù)器端。一種是客戶端控件一字節(jié)流的方式輸出到瀏覽器端在瀏覽器端生成DOM對(duì)象實(shí)例,運(yùn)行在客戶端??蛻舳丝丶褪菢?biāo)準(zhǔn)的html標(biāo)簽,客戶端控件又分為兩種一種是asp.net自身的控件如: <asp:Button ID="Button1" runat="server" Text="Button" />。一種是標(biāo)準(zhǔn)的html控件加一個(gè)ruant=server屬性的運(yùn)行在服務(wù)器端的客戶端控件。<input type="text" id="t1" runat="server" />這種控件一旦加了ruant=server屬性后便會(huì)在服務(wù)器端生成一個(gè)對(duì)象,在網(wǎng)站的后臺(tái)代碼中就可以操縱它了。其實(shí)不光是它,所有的服務(wù)器端控件都會(huì)在服務(wù)器端生成一個(gè)對(duì)象,也就是說(shuō)每一個(gè)服務(wù)器端控件都對(duì)應(yīng)著一個(gè)對(duì)象實(shí)例,它們都必須有runat="server"屬性。而客戶端控件也就是標(biāo)準(zhǔn)的html控件不會(huì)在服務(wù)器端生成對(duì)象實(shí)例,它是在輸出到瀏覽器后變成了DOM模型中的客戶端控件,供js腳本來(lái)操縱的。在aspx動(dòng)態(tài)模板上有很多控件na怎樣區(qū)別不同的控件呢?通過(guò)ID屬性,可以給每一個(gè)控件(包括客戶端控件)加一個(gè)唯一標(biāo)識(shí)它的ID屬性來(lái)區(qū)別不同的控件。最后最重要的一點(diǎn)是不管頁(yè)面模板上放的是什么控件最終都被轉(zhuǎn)換成為標(biāo)準(zhǔn)的html形式的字節(jié)流輸出到了客戶端的瀏覽器中(瀏覽器只能識(shí)別標(biāo)準(zhǔn)的html標(biāo)記語(yǔ)言)瀏覽器拿到字節(jié)流后,按照包頭的編碼轉(zhuǎn)換為字符串也就是html文檔,然后解析html文檔解析為一個(gè)dom樹(shù)模型接著瀏覽器開(kāi)始顯示dom樹(shù),這時(shí)頁(yè)面就到了客戶端了,就可用js來(lái)操縱整個(gè)html文檔了這一部分的編程叫前端或前臺(tái)編程,可以看到在整個(gè)的過(guò)程中asp.net僅僅扮演了一個(gè)動(dòng)態(tài)模板的的角色最終輸出的結(jié)果永遠(yuǎn)是靜態(tài)的標(biāo)準(zhǔn)的html標(biāo)記,所以asp.net其實(shí)就是一個(gè)模板一種動(dòng)態(tài)的生成靜態(tài)頁(yè)面的技術(shù)(有關(guān)一次請(qǐng)求的處理過(guò)程以及asp.net進(jìn)程和頁(yè)面類的一系列事件在另外的筆記中和博客園的博客中有詳細(xì)記載)。最后一點(diǎn)是關(guān)于這三種控件的性能,html標(biāo)準(zhǔn)控件封裝最少性能最佳,html標(biāo)準(zhǔn)控件加一個(gè)ruant=server屬性的運(yùn)行在服務(wù)器端的控件的居次,而標(biāo)準(zhǔn)的服務(wù)器端控件的功能是最強(qiáng)的但也是封裝最多的相對(duì)于前面兩個(gè)它效率是最慢的。所以能用html標(biāo)準(zhǔn)控件完成的任務(wù)最好不要用另外兩種。
2.關(guān)于控件事件
[1]客戶端控件的控件事件是注冊(cè)在頁(yè)的<script></script>標(biāo)記中在瀏覽器中用js來(lái)執(zhí)行的.
[2]而服務(wù)器端控件的事件是注冊(cè)在了服務(wù)器的后臺(tái)頁(yè)面類對(duì)象上的是用c#在服務(wù)器端執(zhí)行的.
[3]不過(guò)服務(wù)器控件功能比較強(qiáng)大,它還有一個(gè)事件叫 OnClientClick 這個(gè)事件可以在瀏覽器端用js執(zhí)行,如果給一個(gè)標(biāo)簽同時(shí)加上OnClientClick事件和OnClick事件那么當(dāng)用戶點(diǎn)擊該控件時(shí)將先在客戶端執(zhí)行一遍事件處理方法當(dāng)請(qǐng)求到達(dá)服務(wù)器端后還要執(zhí)行一遍服務(wù)器端的事件處理器。嗯是挺強(qiáng)悍的。
[4]最后一種控件事件是運(yùn)行在服務(wù)器端的客戶端控件也就是標(biāo)準(zhǔn)的html控件加一個(gè)ruant=server屬性的控件,它的事件和客戶端控件是一樣的也是注冊(cè)在頁(yè)的<script></script>標(biāo)記中在瀏覽器中用js來(lái)執(zhí)行的。雖然他也在后臺(tái)生成一個(gè)類的實(shí)例,但它不能在服務(wù)器端生成事件處理器,不是嫡系的待遇就是不一樣啊呵呵呵!
【1】<input id="Button1" type="button" value="button" onclick="return Button1_onclick()" />
【2】<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
【2】protected void Button1_Click(object sender, EventArgs e){};
【3】<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="btn_click();" onclick="Button1_Click" />
【4】<input id="Button1" type="button" value="button" runat ="server" onclick="return Button1_onclick()" />
【4】<script type="text/javascript">
function Button1_onclick() { }
</script>
聯(lián)系客服