一、asp.net頁面的處理順序
asp.net頁面是由事件來驅動的,首先執行的是init事件,在代碼中,系統自動增加了一個oninit的重載函數,從而在頁面init的時候就執行這個oninit函數。在這個函數中,會執行initializecomponent函數,這個函數里就有很多控件事件的代理函數,展開一個頁面的"web formdesigner generated code",我們就可以看見這些。
  頁面在執行完init之后,就是load事件,對應的代碼就是page_load。
  然后就是引起頁面返回的事件的代碼,當然,如果頁面是第一次運行的話,就沒有這一步了。
  也就是說,頁面每次刷新的時候都會執行page_load函數,這也就是為什么有些代碼要寫在
    if (!page.ispostback)
    { ... }
  中的原因。比如有一個文本框,如果在page_load中設置初始值,放在哪兒呢?如果放在if外面,那每次刷新的時候都會執行這個賦值語句,即使在頁面中修改了文本框的值,在返回之后仍然會消失,但是如果放在if之中,那就可以了,返回之后文本框中仍然是先前的值。
  很多朋友的datagrid無法獲取編輯后的值,也可能就是這個原因。
二、javascript在頁面中的應用
雖然asp.net采用新的運行機制,但是最后生成的還是能被一般瀏覽器識別的html和javascript代碼。
在頁面中,仍然可以通過response.write來寫出一段js代碼,比如要彈出一個新的瀏覽器窗口,可以用response.write(@"<script language=javascript>window.open('url');</script>");
在web控件中,attributes屬性集合也和js聯系緊密。新增加的一個attributes元素就對應web控件最后生成的html代碼的一個屬性或者事件。
比如有一個textbox,要求我們在它獲得焦點的時候選中全部的文本,我們就可以這樣處理:textbox1.attributes["onfocus"]="javascript:this.select();";通過在ie中查看頁面的源代碼,我們可以看到這樣的一段:<input type=textonfocus="javascript:this.select();"...>,至于是什么意思就不用我解釋了吧。
  另外還有一個應用,如果有一個button,它的click事件中有很多對數據庫的一些操作,我們要求用戶在按了這個button之后確認一次(這有點想asp中的msgbox),現在我們就可以這樣處理:button1.attributes["onclick"]="javascript:return confirm('are your
sure...');";最后的效果如我們想像。
注:以上代碼在codebehind中運行通過。至于代碼與頁面混在一起的情況,在書寫的時候可能會有所不同。
三、關于代碼重用
asp.net已經基本轉向了oo的層面上來,其中的代碼基本都是通過類來執行的。就像我們寫c/s系統一樣,用一個或者多個class來保存公用的函數,然后再在其他函數中調用。
還有一個方法就是寫到一個基類里,其他類繼承這個基類。至于用那種方法,那看個人愛好以及函數的處理范圍。
我前段事件做的一個項目是這樣做的,有兩個基類,一個是中間層的基類,一個是頁面class的基類(繼承system.web.ui.page)。然后把一些數據庫的處理放到前一個基類里,把頁面控件的一些常用操作放到后一個基類里。
四、web控件
有幾個控件是我們應該有很深的理解的:datagrid、datalist。這兩個控件在顯示數據上為我們提供了極大的方便,它們的各種用法,需要我們在實踐中不斷摸索、不斷總結。
另外,自定義控件也是一個比較重要的范圍。
在自定義控件的類型選擇上,如果你只是一般的顯示一些固有的控件,而不作屬性、事件的操作,那寫成usercontrol會簡單一點,這樣的自定義控件相當于asp中通過include執行的代碼。如果你想在設計、運行中修改控件內部的屬性、得到控件的某些事件,那最好寫成一個dll文件,也就是寫成一個類,這樣的控件可以像一般的web控件一樣,用鼠標拖動大小,設置屬性,獲取事件等。
新聞熱點
疑難解答
圖片精選