推薦:ASP.Net用MD5和SHA1加密的幾種方法首先簡單介紹一下MD5和SHA1: MD5的全稱是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由Mit Laboratory for Computer Science和Rsa data security inc的Ronald l. rivest開發出
實現的過程基本上就是:讓要實現客戶端回調功能的頁面或者空間實現System.Web.UI.ICallbackEventHandler的接口,即2個方法:void RaiseCallbackEvent(string eventArgument),這個是當客戶端觸發服務器端事件的委托方法,string GetCallbackResult();這個是返回客戶端需要的值,只能是string 型的,當然你也可以返回一個Json串。
然后在pageload的時候注冊腳本到客戶端:在這里注冊一個CallServer方法來調用服務器端方法,ReceiveServerData來捕獲服務器返回的結果。當然你也可以使用一個方法來捕獲服務器端的錯誤,詳見Page.ClientScript.RegisterClientScriptBlock這個方法的MSDN解釋。
這樣就能實現客戶端的回調服務器端事件,并返回值。
生成好頁面后,查看源代碼:
首先是多了一個js資源文件,多了一行這樣的代碼:
在body快結束的時候還有一段這樣的代碼:
WebForm_InitCallback();好,這些應該就是asp.net為了實現客戶端回調所作的補充工作了吧,咱們來研究吧。
首先看js資源文件(20多K,汗一個...)。先在資源文件里面找到這個方法,WebForm_InitCallback();
方法如下:
| 1function WebForm_InitCallback() { 2 var count = theForm.elements.length; 3 var element; 4 for (var i = 0; i < count; i ) { 5 element = theForm.elements[i]; 6 var tagName = element.tagName.toLowerCase(); 7 if (tagName == "input") { 8 var type = element.type; 9 if ((type == "text" type == "hidden" type == "password" 10 ((type == "checkbox" type == "radio") & element.checked)) && 11 (element.id != "__EVENTVALIDATION")) { 12 WebForm_InitCallbackAddField(element.name, element.value); 13 } 14 } 15 else if (tagName == "select") { 16 var selectCount = element.options.length; 17 for (var j = 0; j < selectCount; j ) { 18 var selectChild = element.options[j]; 19 if (selectChild.selected == true) { 20 WebForm_InitCallbackAddField(element.name, element.value); 21 } 22 } 23 } 24 else if (tagName == "textarea") { 25 WebForm_InitCallbackAddField(element.name, element.value); 26 } 27 } 28}這個方法就是把表單里面所有的值全部裝載到一個鍵值對里面去。 |
| function WebForm_InitCallbackAddField(name, value) { var nameValue = new Object(); nameValue.name = name; nameValue.value = value; __theFormPostCollection[__theFormPostCollection.length] = nameValue; __theFormPostData = name "=" WebForm_EncodeCallback(value) "&"; } function WebForm_EncodeCallback(parameter) { if (encodeURIComponent) { return encodeURIComponent(parameter); } else { return escape(parameter); } } |
然后,咱們來看看unction CallServer(arg, context){ WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false);}所作的工作。
在示例中,點擊按鈕,就觸發了CallServer方法,
| function LookUpStock() { var lb = document.getElementById("ListBox1"); var product = lb.options[lb.selectedIndex].text; CallServer(product, ""); } |
| unction WebForm_DoCallback(eventTarget, eventArgument, eventCallback, context, errorCallback, useAsync) { var postData = __theFormPostData "__CALLBACKID=" WebForm_EncodeCallback(eventTarget) "&__CALLBACKPARAM=" WebForm_EncodeCallback(eventArgument); if (theForm["__EVENTVALIDATION"]) { postData = "&__EVENTVALIDATION=" WebForm_EncodeCallback(theForm["__EVENTVALIDATION"].value); } var xmlRequest,e; try { xmlRequest = new XMLHttpRequest(); } catch(e) { try { xmlRequest = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { } } |
這段代碼是將一些參數附加上去到postData變量上。并創建xmlRequest對象。不過這個創建異步對象方法似乎有點不妥,他是先看是否是非IE的瀏覽器,然后被cacth住了才創建ActiveX對象,也就是說在IE大行其道的時候不得不多次catch,為什么不把創建ActiveX對象放在前面節省資源呢?不管這么多,接下來看:
| var setRequestHeaderMethodExists = true; try { setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader); } catch(e) {} var callback = new Object(); callback.eventCallback = eventCallback; callback.context = context; callback.errorCallback = errorCallback; callback.async = useAsync; var callbackIndex = WebForm_FillFirstAvailableSlot(__pendingCallbacks, callback); if (!useAsync) { if (__synchronousCallBackIndex != -1) { __pendingCallbacks[__synchronousCallBackIndex] = null; } __synchronousCallBackIndex = callbackIndex; } if (setRequestHeaderMethodExists) { xmlRequest.onreadystatechange = WebForm_CallbackComplete; callback.xmlRequest = xmlRequest; xmlRequest.open("POST", theForm.action, true); xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xmlRequest.send(postData); return; } |
這幾段語句最重要的是將異步回調方法賦值為:WebForm_CallbackComplete。
不過俺們還忽略了一些細節,讓我們從頭再來。上面有一段代碼
| if (setRequestHeaderMethodExists) 也就是說在setRequestHeaderMethodExists這個變量不為null的時候才能夠發送異步對象,那么這個變量是怎么定義的呢?? var setRequestHeaderMethodExists = true; try { setRequestHeaderMethodExists = (xmlRequest && xmlRequest.setRequestHeader); } |
也就是說只有當正確的創建了xmlRequest對象后才能夠使用ajax,那么如果不能夠正確創建ajax對象怎么辦呢?接著看代碼!
| callback.xmlRequest = new Object(); var callbackFrameID = "__CALLBACKFRAME" callbackIndex; var xmlRequestFrame = document.frames[callbackFrameID]; if (!xmlRequestFrame) { xmlRequestFrame = document.createElement("IFRAME"); xmlRequestFrame.width = "1"; xmlRequestFrame.height = "1"; xmlRequestFrame.frameBorder = "0"; xmlRequestFrame.id = callbackFrameID; xmlRequestFrame.name = callbackFrameID; xmlRequestFrame.style.position = "absolute"; xmlRequestFrame.style.top = "-100px" xmlRequestFrame.style.left = "-100px"; try { if (callBackFrameUrl) { xmlRequestFrame.src = callBackFrameUrl; } } catch(e) {} document.body.appendChild(xmlRequestFrame); } |
接下來原來是創建一個iframe!呵呵,原來是保證所有的瀏覽器都能使用ajax才出的這招。
再下來應該就是給這個iframe里面加載一些變量了,并且提交這個iframe了:
| var interval = window.setInterval(function() { xmlRequestFrame = document.frames[callbackFrameID]; if (xmlRequestFrame && xmlRequestFrame.document) { window.clearInterval(interval); xmlRequestFrame.document.write(""); xmlRequestFrame.document.close(); xmlRequestFrame.document.write(' '); |
原來在最開始初始化客戶端回調的方法就是為了在不能夠正確創建ajax對象的時候,將表單的值全部初始化到另外的iframe里面去的。
好了,整個asp.net客戶端回調的請求發送部分分析完了,看來回調部分要下次了。
如果有分析不對的地方還請大俠指正!
分享:asp.net中生成縮略圖并添加版權//定義image類的對象Drawing.Image image,newimage;//圖片路徑protected string imagePath;//圖片類型protected string imageType;//圖片名稱protected string imageName;//提供一個
新聞熱點
疑難解答
圖片精選