[注
此段與標題內容無關
可略過] 在看完兩集Stargate並且洗了一個澡之後
我終於決定要開始寫這篇文章
這是我第一篇真正意義上的原創技術文章
不管技術含量如何
我總算是邁出了這一步
博客其實開過不少
從最早的校園大巴
到博客園
以及我那個用來發牢騷的新浪博客
其實開博客最初的目的就是用來在寫程序的同時
記錄一下自己的學習的過程
但是後來演變成了用來發牢騷的東西
這也算是我一直以來不能專心鑽研的惡果吧
不過所謂亡羊補牢為時未晚
就從這篇文章開始
變得專注一點
再專注一點
由這種專注的思想引導
我最近終於又開始好好的寫程序
這次是真的放下了那些不想干的東西
專心致志的開始寫我喜歡的C#代碼
在我所知道的編程語言裡面我最喜歡的是C#和javascript
後者是種腳本語言
准確地說j是我最近才喜歡上的
我原來以為它也就同我小時候玩的Basic一般
小巧也簡單
但是事實證明不是這個樣子的
雖然它和VBS一樣也是腳本語言
但是在它C語言的外表之下
其實隱藏著更多的內容
這個我可能會寫另外的一篇文章來描述它
現在切入正題
我喜歡的
NET平台
不知道為什麼
年的時候第一次使用C#語言寫代碼
就覺得它很漂亮
然後就愛上了他
不過那個時候由於環境的問題
所以一度中斷
一直到了
年
才又重新拾起來
但是一年多的時候
我也只是在拉著一堆堆的控件
然後在屬性面板裡調整啊調整
似乎忘記了Web原來有的樣子是怎麼樣的
後來終於有一樣東西換起了我的回憶
Ajax
到處都是Ajax開發框架
其實在ASP
NET
發布的時候內部其實就整合了一些類似的內容
在一些數據控件比如GridView上面就有使用
在
年一月份的MSDN Magazine中的一篇《Custom Script Callback in ASP
NET》(中文版 | English)讓我認識到了 裡面異步調用的魅力(裡面的實現方法僅限於在beta
版本中實現
關於腳本回調部分beta
beta
以及正式版本之間都有所不同
有興趣者可以自己參見最近發布的MSDN內容)
不過當時也只是玩了一下
後來使用Atlas
也就對它沒怎麼上心
不過前一段時間一個朋友和我討論實現ajax時講到
atlas實現太過於繁瑣
而他要實現的只是幾個非常小的內容不需要那麼麻煩
由於我對除了這些之外的
NET的ajax框架不熟悉
所以自然而然的就想起了內置的腳本回調機制
利用(經過他本人同意的)朋友的項目
我們編寫了很多關於這個的代碼
在寫完之後我突然發現了一個問題
就是代碼太亂了
每個頁面都是類似的東西
而且只能傳遞一個字符串參數讓我們在除了交互方面對於一些大開銷的數據展示只好使用內嵌框架來實現了
前兩天到海圖買了一本《Ajax 高級語言程序設計》
看了一部分之後突然想搞明白
裡面的腳本回調又是如果實現的?其實現在轉回來頭看
《Custom Script Callback in ASP
NET》一文中很多地方已經講的很明白了
可以無奈當時的水平
很多東西看的都是雲裡霧裡的
光顧者看效果了先貼一個我認為最簡潔的實現效果
然後再進行剖析
新建一個Default
aspx的頁面
在頁面上添加一個CheckBox控件
然後打開Default
aspx
cs文件
_Default類添加三個繼承的接口ICallbackContainer
ICallbackEventHandler和INamingContainer
[代碼
]
#region ICallbackContainer 成員
public string GetCallbackScript(IButtonControl buttonControl
string argument)
{
throw new Exception(
The method or operation is not implemented
);
}
#endregion
#region ICallbackEventHandler 成員
string temp;
public string GetCallbackResult()
{
//throw new Exception(
Sample Error
);
return temp;
}
public void RaiseCallbackEvent(string eventArgument)
{
temp =
_____
+ eventArgument +
is succeed
_____
;
}
#endregion
轉到Default
aspx
cs頁面的Page_Load方法中加入下面代碼
[代碼
]
proected void Page_Load(object sender
EventArgs e)
{
string temp = Page
ClientScript
GetCallbackEventReference(this
arg
Callback
context
OnError
true);
string script =
function CallServer(arg
context){
+ temp +
}
;
Page
ClientScript
RegisterClientScriptBlock(this
GetType()
abc
script
true);
CheckBox
Attributes
Add(
onclick
CallServer(
I call Server
context
);
);
}
在編輯完CS代碼之後
打開Default
aspx文件
在<head>
</head>之間加入下列代碼
[代碼
]
<script type=
text/javascript
>
function OnError(err
context)
{
alert(err);
}
function Callback(arg
context)
{
alert(arg);
}
</script>
這裡的CheckBox控件是隨便拉上去的
有需要可以隨便更改
不過用Button控件的時候可能要注意一下
它默認就會激活OnSubmit事件
所以可能要設置或是直接使用HTML控件就好了
以上的代碼算是腳本回調最小化的實現
都是必須的缺一不可
使用基本回調的控件必須實現三個接口分別是
ICallbackContainer
INamingContainer和ICallbackEventHandler
其實INamingContainer沒有需要實現的接口內容
它只是
標識在 Page 對象的控件層次結構內創建新 ID 命名空間的容器控件
(引自MSDN)
至於ICallbackContainer這個接口
在MSDN(中文版本)裡面給出的解釋比較模糊
相關聯的一些文章也都是介紹腳本回調和ICallbackEventHandler接口的
因為我們這裡是用頁面作為回調的基礎
所以沒有使用這個接口要實現的方法GetCallbackScript
但是如果是封裝自己的Ajax控件那這個方法就十分有用了
這裡我們只是用了ICallbackEventHandler實現的方法來處理數據
因為在Page_Load方法中我注冊了一個CallServer的方法
然後依附於CheckBox的OnClick事件上觸發
這樣我們就可以看法一個比較清晰的調用過程了
後面[代碼
]我實現了兩個Javascript方法
一個是用來處理調用出錯的
另外一個就是用來處理調用成功之後處理返回信息的了
在[代碼
]裡面有一段拋出異常的代碼被我注釋掉了
通過這句代碼就可以模擬調用OnError方法了
一直到這裡我們都是看到的實現這個調用是怎麼樣的
說白了這其實算是一種比價高級的拖控件的方式
但是它到底是怎麼實現的呢?為什麼我沒有看到任何有關於XmlHttpRequest的內容呢?(我堅信這是實現Ajax最好的方法
因為這段代碼在任何支持Javascript浏覽器上都可以使用
我想應該不會和暗門有關系吧)
From:http://tw.wingwit.com/Article/program/net/201311/12659.html