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