asp.net控件本质
生活随笔
收集整理的這篇文章主要介紹了
asp.net控件本质
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
.net控件本質(zhì)
在我的一個項目中需要對于控件進行區(qū)分總結(jié),我在網(wǎng)上找了找加上自己的實際測試總結(jié)如下:(如果有什么不正確的請即使指出,一起討論,大家共同進步)????????asp.net之所以現(xiàn)在開發(fā)方便和快捷,關(guān)鍵是它有一組強大的控件庫,包括web服務(wù)器控件,web用戶控件,web自定義控件,html服務(wù)器控件和html控件等。這里我主要說說html控件、html服務(wù)器控件和web服務(wù)器控件的區(qū)別。
????1。html控件:就是我們通常的說的html語言標記,這些語言標記在已往的靜態(tài)頁面和其他網(wǎng)頁里存在,不能在服務(wù)器端控制的,只能在客戶端通過javascript和vbscript等程序語言來控制。
<input?type="button"?id="btn"?value="button"/> ????2。html服務(wù)器控件:其實就是html控件的基礎(chǔ)上加上runat="server"所構(gòu)成的控件.它們的注意區(qū)別是運行方式不同,html控件運行在客戶端,而html服務(wù)器控件是運行在服務(wù)器端的。參考其他資料是這樣說的:?????? 當ASP.NET?網(wǎng)頁執(zhí)行時,會檢查標注有無runat?屬性,如果標注沒有設(shè)定,那么Html標注就會被視為字符串,并被送到字符串流等待送到客戶端,客戶端的瀏覽器會對其進行解釋;如果Html標注有設(shè)定runat="server"?屬性,Page?對象會將該控件放入控制器,服務(wù)器端的代碼就能對其進行控制,等到控制執(zhí)行完畢后再將Html服務(wù)器控件的執(zhí)行結(jié)果轉(zhuǎn)換成Html標注,然后當成字符串流發(fā)送到客戶端進行解釋 <input?id="Button"?type="button"?value="button"?runat="server"?/> ????3。web服務(wù)器控件:也稱asp.net服務(wù)器控件,是Web Form編程的基本元素,也是asp.net所特有的。它會按照client的情況產(chǎn)生一個或者多個html控件,而不是直接描述html元素。如: <asp:Button?ID="Button2"?runat="server"?Text="Button"/> 那么它和html服務(wù)器控件有什么區(qū)別呢?參照其他網(wǎng)頁的資料看法如下:
?????????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標注和Html服務(wù)器控件的事件處理都是在客戶端的頁面上,而Asp.net服務(wù)器控件則是在服務(wù)器上,舉例來說:
????????<input?id="Button4"?type="button"?value="button"?runat="server"/>是Html服務(wù)器控件,此時我們點擊此按鈕,頁面不會回傳到服務(wù)器端,原因是我們沒有為其定義鼠標點擊事件。
????????<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標注和Html服務(wù)器控件的事件是由頁面來觸發(fā)的,而Asp.net服務(wù)器控件則是由頁面把Form發(fā)回到服務(wù)器端,由服務(wù)器來處理。
????4。下面我就結(jié)合我自己的測試來說明問題:
這段代碼是我放在repeat中的模板里的:其中DeleteCheck是一個js腳本函數(shù),注意是用于是否發(fā)送到服務(wù)器端的,這里就不展示腳本代碼了。 ?<input?runat="server"?type="button"?id="delete"?value="Server?button"?/>
??<input?type="button"?onclick="return?DeleteCheck(this)"?id="Button1"?value="Client?button"?/>
??<input?runat="server"?type="submit"?onclick="return?DeleteCheck(this)"?id="Button2"?value="Server?submit"?/>
??<input?type="submit"?onclick="return?DeleteCheck(this)"?id="Button3"?value="Client?submit"?/>
??<button?runat="server"?id="button4"?onclick="return?DeleteCheck(this)"?value="Button-Button">Button-Button</button>
??<asp:Button?runat="server"?ID="button5"?OnClientClick="return?DeleteCheck(this)"?Text="Asp:button"?/>
展現(xiàn)出來的html代碼如下: ?<input?name="Data$ctl03$delete"?type="button"?id="Data_ctl03_delete"?value="Server?button"?/>
??<input?type="button"?onclick="return?DeleteCheck(this)"?id="Button1"?value="Client?button"?/>
?<input?name="Data$ctl03$Button2"?type="submit"?id="Data_ctl03_Button2"?onclick="return?DeleteCheck(this)"?value="Server?submit"?/?>?
? <input ut?type="submit"?onclick="return?DeleteCheck(this)"?id="Button3"?value="Client?submit"?/>
??<button?id="Data_ctl03_button4"?onclick="return?DeleteCheck(this)"?value="Button-Button">Button-Button</button>
??<input?type="submit"?name="Data$ctl03$button5"?value="Asp:button"?onclick="return?DeleteCheck(this);"?id="Data_ctl03_button5"?/> 可以看出以下幾點:
1。當控件屬性中有runat="server"時,生成的html控件時name和id發(fā)生的變化(.net Framework)。
2。當asp:button服務(wù)器按鈕通過生成的頁面后轉(zhuǎn)化成類型為submit類型的Client控件。
3。當控件是html控件時通過生成的頁面和原來的html代碼完全一樣(理由上面已經(jīng)說名)。
另外我還測試了把這段代碼直接放到form標記中(不放到其他子標記中)如: ?<input?runat="server"?type="button"?id="delete"?value="Server?button"?onserverclick="delete_ServerClick"?/>
?<input?type="button"?onclick="return?DeleteCheck(this)"?id="Button1"?value="Client?button"?/>
?<input?runat="server"?type="submit"?onclick="return?DeleteCheck(this)"?id="Button2"?value="Server?submit"?/>
?<input?type="submit"?onclick="return?DeleteCheck(this)"?id="Button3"?value="Client?submit"?/>
?<button?runat="server"?id="button4"?onclick="return?DeleteCheck(this)"?value="Button-Button">Button-Button</button>
?<asp:Button?runat="server"?ID="button5"?OnClientClick="return?DeleteCheck(this)"?Text="Asp:button"?OnClick="button5_Click"?/>
?<asp:LinkButton?ID="LinkButton1"?runat="server"?OnClick="LinkButton1_Click">LinkButton</asp:LinkButton> 直接放到form標記中生成的html代碼
<script?type="text/javascript">
<!--
var?theForm?=?document.forms['form1'];
if?(!theForm)?{
????theForm?=?document.form1;
}
function?__doPostBack(eventTarget,?eventArgument)?{
????if?(!theForm.onsubmit?||?(theForm.onsubmit()?!=?false))?{
????????theForm.__EVENTTARGET.value?=?eventTarget;
????????theForm.__EVENTARGUMENT.value?=?eventArgument;
????????theForm.submit();
????}
}
//?-->
</script>
???<input?language="javascript"?onclick="__doPostBack('delete','')"?name="delete"?type="button"?id="delete"?value="Server?button"?/>
????<input?type="button"?onclick="return?DeleteCheck(this)"?id="Button1"?value="Client?button"?/>
????<input?name="Button2"?type="submit"?id="Button2"?onclick="return?DeleteCheck(this)"?value="Server?submit"?/>
????<input?type="submit"?onclick="return?DeleteCheck(this)"?id="Button3"?value="Client?submit"?/>
?????<button?id="button4"?onclick="return?DeleteCheck(this)"?value="Button-Button">Button-Button</button>
?????<input?type="submit"?name="button5"?value="Asp:button"?onclick="return?DeleteCheck(this);"?id="button5"?/>
?????<a?id="LinkButton1"?href="javascript:__doPostBack('LinkButton1','')">LinkButton</a> 這里有可以看出幾點:
1。當html服務(wù)器控件在服務(wù)器端添加了服務(wù)器事件后生成的代碼變?yōu)?οnclick="_doPostBack()",實際上是調(diào)用腳本把整個窗體提交到服務(wù)器(如果沒有添件服務(wù)器事件而只是添加了runat="server"是不會發(fā)送到服務(wù)器端的)這里注意如果要在html服務(wù)器控件中添加一個客戶端事件如上面的 <input?runat="server"?type="button"?id="delete"?value="Server?button"?onserverclick="delete_ServerClick"?/>
變成 <input?runat="server"?type="button"?id="delete"?value="Server?button"?οnclick="return DeleteCheck(this)" onserverclick="delete_ServerClick"?/>
那樣生成的html代碼變成 ??<input?language="javascript"?onclick="return?DeleteCheck(this) ?__doPostBack('delete','')"?name="delete"?type="button"?id="delete"?value="Server?button"?/> 提示有腳本錯誤原因是onclick事件執(zhí)行了2個腳本且書寫的格式不正確。οnclick="return DeleteCheck(this);_doPostBack()"這樣的話就只能執(zhí)行第一個函數(shù)而第二個函數(shù)就不能執(zhí)行了(return).如果用οnclick="return DeleteCheck(this),_doPostback()"是指2個函數(shù)同時都要執(zhí)行沒有影響(相當于一條語句)。
2。控件的名字沒有發(fā)生變化,這個問題我也不太明白為什么不發(fā)生變化,請高手門指教哈
3。asp:button中的onclientclick事件生成后就變成了onclick事件了,類型變成了type="submit".然而服務(wù)器事件的onclick我想是通過發(fā)送到服務(wù)器端執(zhí)行的(具體我也不太很清楚)。
4。LinkButton不定義onclick事件,它會自動的生成下面代碼發(fā)送到服務(wù)器端。 href="javascript:__doPostBack('LinkButton1','?')"?? 以上是我對asp.net控件進行了簡單的介紹。這只是我個人的觀點總結(jié),有什么不正確的希望朋友能夠提出來,我們大家共同討論,共同進步。 付出最大努力,追求最高成就。
總結(jié)
以上是生活随笔為你收集整理的asp.net控件本质的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈ASP.NET的Postback
- 下一篇: ASP.NET服务器端控件原理分析