當然不是因為Java程式員不用ASP.NET控件,我覺得.NET程式員很大一部分就輸在.NET平台尤其是Visual Studio的易用性上了,根本無需了解HTTP協定,就可以通過拖拽控件做出網頁,也不用了解表單送出等最基本知識就可以做到頁面和伺服器通信,甚至不知道用戶端與伺服器在通信。
Java就不同了,IDE比較不智能,沒有拖來拖去的控件,甚至Java初學者想寫出“Hello World”都得花上一天時間研究環境變量配置,不了解表單和post就取不到input的值,想做網站首先得了解Tomcat等伺服器。沒有什麼便利性可言的Java在強迫我們學習,事情必須明白了,才能做出來,而.NET把這些都封裝好了,拿來就能用,很多在校大學生沒學過Java的話都不知道ASP.NET Web Application怎麼在脫離Visual Studio的情況下運作,更不用說簡單的IIS配置了,根本不知伺服器為何物,被.NET寵壞了。
balabala說了這麼多廢話,意思就是.NET在以其易用性溺愛我們,.NET程式員不能一直沉浸在我把XXX給做出來了就很滿足的狀态,而得有一種刨根問底的精神去鑽研其原理,相信已經這麼做的同學在看到網上沸沸揚揚的.NET與Java優劣之争的時候都會報之于呵呵。言歸正傳,先看看理論篇中最後提煉的幾個問題。
這個問題通俗講就是,怎麼在伺服器端修改頁面DIV或者“調用”JavaScript。如果了解了理論篇中的HTTP協定的講解就應該知道伺服器修改頁面DIV或者調用JavaScript是不可能的,伺服器隻能給浏覽器一個全新的頁面(不考慮Ajax)。那麼是不是這個問題就無解了呢?确實是!但是,然而可以利用伺服器給浏覽器全新頁面這一特性來達到好像伺服器修改了用戶端頁面的效果。
來嘗試一下在”伺服器“端修改頁面上的一個DIV為span


對于這種需求一般有兩種思路:
把需要更改的地方做成伺服器端控件,這樣就可以在伺服器端使用規則,把想要的效果修改到全新的HTML文本中,然後傳給浏覽器,是以可以這樣把頁面改動一下,把欲改動部分用伺服器端控件表示


這樣就可以在Button的Click事件處理程式中修改DIV中的文字了
看到這裡可能剛入門ASP.NET的同學都要問了:您這是.NET科普嘛?這樣确是比較弱,雖然常用但很多和頁面互動的地方需要JavaScript來處理,并不是簡單的改變文字就可以做到的,這時候就要換換思路了
本來應該用戶端做的事情就應該讓用戶端來做。拿上面的例子,可能頁面上已經有JavaScript方法來處理修改DIV内文字了,欠的就是伺服器端調用了。


你看這個函數要做的事情相當複雜,沒發通過伺服器改文字做出來,怎麼辦!貌似伺服器調用JavaScript方法是個不錯的路子,但前面的理論已經告訴了我們不可能,伺服器給浏覽器的時一個新的HTML文本,又不是調用函數的句柄,但是如果我們往新的HTML頁面裡添加的調用此方法的語句不就實作了嗎?來看看我們怎麼實作向新的HTML文本中添加調用JavaScript的語句。
先在頁面上添加一個literal控件用來存放新追加的調用JavaScript函數語句,至于放在最後是因為執行此語句的時候我們需要頁面上的元素已經準備好,當然也可以通過jQuery的ready實作


這時候事情就簡單了,可以像剛才那樣修改文字一樣修改Literal内容,差別隻是我們需要添加的文字是JavaScript語句
這樣點選按鈕後效果是這樣的,可以看到Literal部分已經變成了調用函數的語句,這樣DIV内容就被修改了,我們就從效果上實作的伺服器“調用”JavaScript
效果是有了可是這樣寫好醜陋啊,又得自己加個Literal,搞笑的是還得使用一對script标簽包起來。
确實是,其實還有其他方法,比如調用Response.Write、Page.Controls.Append啊等等,大同小異,這樣寫最容易了解,一旦我們知道為什麼這樣就可以讓伺服器“調用”JavaScript後,就可以用.NET貼心的方法來做此事了,.NET團隊已經想到了開發者會有這樣的需求,特意設計了幾個内置函數解決伺服器端向頁面注冊腳本的問題。
Page.ClientScript.RegisterClientScriptBlock
把腳本注冊到頁面頂部
Page.ClientScript.RegisterStartupScript
把腳本注冊到頁面底部
Page.ClientScript.RegisterClientScriptInclude
向頁面注冊腳本檔案
關于這Sanger方法具體解釋及用法可以去網上搜一下資料,前兩個的差別是把腳本注冊到頁面的什麼位置,第三個可以把一個腳本檔案引入頁面,這個例子中應該使用Page.ClientScript.RegisterStartupScript,這時候醜陋的包裝就可以删去了
正想截屏呢,發現犯了一個錯誤,這個方法把腳本注冊到form的底端,而不是body,是以頁面也要稍微修改一下,把modifyDivLiteral方法往前放一放


這樣最後生成的頁面是這樣的,是不是達到預期目的了呢
總而言之,由于浏覽器并不是把頁面全文發給伺服器,也就是說頁面上的DIV及JavaScript語句并沒有發送到伺服器,在伺服器端想修改DIV或者調用JavaScript是不可能的,要麼修改頁面源碼,讓浏覽器加載新的内容,達到更新目的,要麼就像預約,或者點菜,向頁面注入指令,讓頁面在浏覽器端做某事。
本來想一篇說完呢,沒想到最簡單的問題内容就這麼多,隻好分篇說了,欲知用戶端如何”調用“伺服器端方法,且聽下回分解
本文轉自魏瓊東部落格園部落格,原文連結:http://www.cnblogs.com/dolphinX/p/3335610.html,如需轉載請自行聯系原作者