asp.net服务器控件与html服务器控件的区别
在ASP.NET開發中用到的控件可以分為三種:傳統html控件(比如<input type="button"/>)、html服務器控件(比如<input type="button" runat="server"/>)以及ASP.NET服務器控件(比如<asp:Button runat="server"?/>)。
初學ASP.NET,第一種控件相當于在客戶端運行,在服務器端無法用代碼捕獲它;后面兩種控件都是在服務器端運行,他們都需要設置id,我們可以在服務器端用id來自動捕獲它們,html服務器控件<input type="button" runat="server"/>對應著System.Web.UI.HtmlControls.HtmlInputButton,ASP.NET服務器控件<asp:Button />對應著System.Web.UI.WebControls.Button類。但是html服務器控件和ASP.NET服務器控件的屬性并不是完全相同的,比如button1是ASP.NET服務器Button,button2是html服務器Button,如果我們想獲得ASP.NET服務器Button上的文字我們用button1.Text獲得,如圖:
如果我們想獲得html服務器Button上的文字我們用button2.value,如圖下圖:
為了進一步搞明白二者在功能實現上的區別,以下面的例子進行分析:
[html]?view plaincopy
?生成的界面很簡單,只有兩個按鈕,這兩個按鈕所實現的功能完全相同,如下圖所示:
單擊其中任何一個按鈕都會首先觸發客戶端單擊事件,(asp.net服務器控件的客戶端單擊事件是OnClientClick,html服務器控件的客戶端單擊事件是onclick。)(asp.net服務器控件的服務器端單擊事件是onclick(),html服務器控件的服務器端單擊事件是onserverclick())如下圖所示:
然后會繼續觸發服務器單擊事件,如下圖所示:
下面我們看一下生成的源文件:
?
[html]?view plaincopy注意:由于form1內含有服務器控件,所以form1必須具有runat="server"。只要form1具有runat="server",最終生成的html源代碼中會自動生成一個doPostBack方法,如果沒有runat="server“,那么不會產生doPostBack方法。doPostBack方法是用于進行回發的,是通過theForm.submit()這句代碼來實現,即提交表單實現了回發的過程,從而在服務器端觸發一些列事件:Page_Load事件、Button的單擊事件等等,你也許要問在服務器怎么知道該觸發哪個按鈕的單擊事件呢?其實服務器會保存服務器控件的狀態和屬性,它會利用ViewState來保存這些信息,具體是通過上面的許多自動生成的<input type="hidden" />來實現的,這部分的內容是默認經過Base64編碼的,在回傳到服務器處理時服務器又會將它們還原成控件的狀態數據。
我將源文件中的幾處做了重點標記,我們著重分析一下,如下圖所示:
1.首先來看<asp:Button ID="button1" runat="server"? OnClientClick="BtnClientClick()" OnClick="button_Click" Text="ASP.NET服務器Button"? />,這里面的OnClientClick表示的是客戶端單擊事件,OnClick表示的是服務器端單擊事件,這里的OnClick寫成onclick也是正確的。注意:該ASP.NET服務器Button沒有onserverclick,OnClick起到了onserverclick的功能。
再來看<input type="button" runat="server" id="button2" οnclick="BtnClientClick();"? onserverclick="button_Click" value="html服務器Button"? />,這里的onclick與上面的不同,這里的onclick表示的是客戶端單擊事件,onserverclick表示的是服務器端單擊事件。注意:該html服務器Button沒有onclientclick,onclick起到了onclientclick的功能。
?
2.由于form1是runat="server",源代碼中自動生成了一個用于回發的doPostBack客戶端腳本。
?
3.ASP.NET服務器控件<asp:Button runat="server"/>被解析成了<input type="submit"/>,單擊該按鈕的時候首先會執行客戶端腳本οnclick=”BtnClientClick();“,由于已經解析成了submit,所以然后會自動將表單進行提交,相當于執行了form1.submit(),實現回發,進而觸發Page_Load事件與按鈕單擊等事件。這一過程就實現了先觸發客戶端單擊事件,然后觸發服務器端單擊事件。
?
4.html服務器控件<input type="button" runat="server" id="button2" οnclick="BtnClientClick();"? onserverclick="button_Click" value="html服務器Button"? />被解析成了<input οnclick="BtnClientClick(); __doPostBack('button2','')" name="button2" type="button" id="button2" value="html服務器Button" />,之前的客戶端單擊事件οnclick="BtnClientClick();"? 和服務器單擊事件onserverclick="button_Click"在解析后被整合成了一個οnclick="BtnClientClick(); __doPostBack('button2','')" 。解析后,該按鈕的單擊事件綁定了兩個事件處理方法,第一個BtnClientClick()用于觸發客戶端單擊事件,后面的__doPostBack('button2','')用于進行回發,并且還給doPostBack設置了參數,符合EventHandler(object sender,EventArgs e)的風格,通過觀察doPostBack函數可以知doPostBack(eventTarget, eventArgument)最終又會執行theForm.submit(),從而對表單進行提交,進行回發,從而也觸發了服務器端的Page_Load事件和按鈕單擊事件。
需要特別注意的是,我們在編譯器中編寫單擊事件οnclick="BtnClientClick();"時,在BtnClientClick()后面加了一個分號,這樣在生成源文件的時候會發現<input οnclick="BtnClientClick(); __doPostBack('button2','')"? />在BtnClientClick()和__doPostBack('button2','')之間多了一個分號,如下圖所示:
如果我們在編寫<input type="button" runat="server" id="button2" οnclick="BtnClientClick()"? onserverclick="button_Click"/>時沒有在BtnClientClick()后面添加分號,那么最終生成的源代碼中也沒有分號:input οnclick="BtnClientClick() ?__doPostBack('button2','')"? />,這樣就會報錯了。所以我們在寫事件代碼時,最好要在函數后面添加分號,這是好的編程風格。
?
5.如果ASP.NET服務器控件既寫了客戶端單擊事件OnClientClick="return ClientFun()"或者OnClientClick="ClientFun()),? 又寫了服務器端單擊事件οnclick="ServerFun()",/那么當單擊該button時,先執行客戶端單擊事件OnClientClick,調用ClientFun(),如果形式是OnClientClick="return ClientFun()",如果返回的是false,則不會觸發服務器端的單擊事件,也不會導致回發,如果OnClientClick="return ClientFun()"返回的是true或者OnClientClick="ClientFun())的形式,/那么在執行完客戶端腳本之后進行回發(回發是指從客戶端到服務器端),回發時,也要先觸發Page_Load事件,然后再根據導致回發的參數確定執行哪一個服務器控件的事件,在本例子中執行ServerFun(),即button_Click(object sender, EventArgs e)/中的Response.Write("<script language='javascript'>alert('服務器端Button Clieked')</script>")代碼,該代碼將里面的腳本寫入客戶端進行執行。html服務器控件應該也具有相同的特性。
具體可以查看:ms-help://MS.MSDNQTR.v90.chs/dv_vwdcon/html/1ab97f0b-1c38-4897-85b0-ac915f6a182b.htm
總結
以上是生活随笔為你收集整理的asp.net服务器控件与html服务器控件的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android Fragment 真正的
- 下一篇: Asp.net控件之异同:HTML控件与