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