為什麼要提到XMLHttpRequest呢?
那是因為在先前在 "ASP.Net MVC - 上傳檔案至Web Server上" 這篇文章裡有提到要如何用Ajax來傳送檔案至Web Server上,
解法就是利用XMLHttpRequest,
所以今天限量就要來淺談一下XMLHttpRequest。
XMLHttpRequest是JavaScipt 一個Class物件,
主要是用來傳遞資料到Web Server並接收Web Server的Response,
Ajax就是基於XMLHttpRequest的一種應用,
要如何使用XMLHttpRequst呢?
以下為使用XMLHttpRequest的基本流程:
1. 產生XMLHttpRequest物件
2. 設定非同步呼叫完成時執行的Listener
3. 判斷回傳結果是否為預期
4. 設定Request Type並開啟XMLHttpRequest
5. 傳送XMLHttpRequest
接著我們就依照流程來一一解釋。
而Microsoft是第一個有XMLHttpRequest想法的發明者,
但在IE7之後,IE就不提供XMLHttpRequest而是提供ActiveXObject,
所以為了在各種瀏覽器上能夠使用XMLHttpRequest,
我們可以加入下列Function來依瀏覽器類型產生XMLHttpRequest物件:
或者可以使用window.ActiveXObject與window.XMLHttpRequest來判斷瀏覽器是否支援。
首先,處理非同步呼叫完成事件的Listener為onreadystatechange,
在這裡要處理的是判斷回傳回來的readyState來做不同的動作,
下表為readyState值所代表的意思:
所以我們要在這裡判斷當readyState為4時進行完成Communication的事情。
這時候就可以使用XMLHttpRequest的status屬性,
status和Http Response的Status Code一樣,
成功就會回傳200,否則就回傳404,
所以只要繼續在onreadystatechange裡判斷status就能知道是否成功失敗。
指定Http Request Type與Url,呼叫open() Function開啟連線,
open() Function的定義如下:open( Method, URL, Asynchronous, UserName, Password )
發送出去後收到Response就會進入onreadystatechange所指定的Function。
經過漫長的解釋後,讓限量Show個範例程式碼來最作後的Ending,
可以將範例程式碼對照步驟看會更清楚了解。
範例程式碼:
Test.cshtml:
HomeController.cs
參考來源:
Understanding Callback using XMLHttpRequest
Wekipedia - XMLHttpRequest
那是因為在先前在 "ASP.Net MVC - 上傳檔案至Web Server上" 這篇文章裡有提到要如何用Ajax來傳送檔案至Web Server上,
解法就是利用XMLHttpRequest,
所以今天限量就要來淺談一下XMLHttpRequest。
XMLHttpRequest是JavaScipt 一個Class物件,
主要是用來傳遞資料到Web Server並接收Web Server的Response,
Ajax就是基於XMLHttpRequest的一種應用,
要如何使用XMLHttpRequst呢?
以下為使用XMLHttpRequest的基本流程:
1. 產生XMLHttpRequest物件
2. 設定非同步呼叫完成時執行的Listener
3. 判斷回傳結果是否為預期
4. 設定Request Type並開啟XMLHttpRequest
5. 傳送XMLHttpRequest
接著我們就依照流程來一一解釋。
1. 產生XMLHttpRequest物件
現今大部分的瀏覽器皆有支援XMLHttpRequest,而Microsoft是第一個有XMLHttpRequest想法的發明者,
但在IE7之後,IE就不提供XMLHttpRequest而是提供ActiveXObject,
所以為了在各種瀏覽器上能夠使用XMLHttpRequest,
我們可以加入下列Function來依瀏覽器類型產生XMLHttpRequest物件:
function CreateXMLHttpRequestObject() { try { return new XMLHttpRequest(); } catch (e) { } try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) { } try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) { } try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { } throw new Error("This browser does not support XMLHttpRequest."); }
或者可以使用window.ActiveXObject與window.XMLHttpRequest來判斷瀏覽器是否支援。
2. 設定非同步呼叫完成時執行的Listener
JavaScript中的XMLHttpRequst Class中有幾個特定處理事件的Listener,首先,處理非同步呼叫完成事件的Listener為onreadystatechange,
在這裡要處理的是判斷回傳回來的readyState來做不同的動作,
下表為readyState值所代表的意思:
readyState值
|
狀態描述
|
0
|
尚未讀取
|
1
|
讀取中
|
2
|
下載完畢
|
3
|
資訊交換中
|
4
|
處理完成
|
所以我們要在這裡判斷當readyState為4時進行完成Communication的事情。
3. 判斷回傳結果是否為預期
接著當完成Communication,要確定Server的Response是否為我們所預期的結果,這時候就可以使用XMLHttpRequest的status屬性,
status和Http Response的Status Code一樣,
成功就會回傳200,否則就回傳404,
所以只要繼續在onreadystatechange裡判斷status就能知道是否成功失敗。
4. 設定Request Type並開啟XMLHttpRequest
接下來就使用第一步驟所產生出來的XMLHttpRequest物件,指定Http Request Type與Url,呼叫open() Function開啟連線,
open() Function的定義如下:open( Method, URL, Asynchronous, UserName, Password )
5. 傳送XMLHttpRequest
最後,使用XMLHttpRequest物件呼叫send() Function將XMLHttpRequest發送出去,發送出去後收到Response就會進入onreadystatechange所指定的Function。
經過漫長的解釋後,讓限量Show個範例程式碼來最作後的Ending,
可以將範例程式碼對照步驟看會更清楚了解。
範例程式碼:
Test.cshtml:
<!DOCTYPE html> <html> <head> <title>Test</title> <script> //XMLHttpRequest物件 var xhr; //產生XMLHttpRequest物件的Function function CreateXMLHttpRequestObject() { try { return new XMLHttpRequest(); } catch (e) { } try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e) { } try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e) { } try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { } throw new Error("This browser does not support XMLHttpRequest."); } //按鈕按下後引發的Functioin function ClickSend() { // 1.產生XMLHttpRequest物件 xhr = CreateXMLHttpRequestObject(); // 2.設定非同步呼叫完成時執行的Listener // 3.判斷回傳結果是否為預期 xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { alert(xhr.responseText); } } // 4.設定Request Type並開啟XMLHttpRequest xhr.open('POST', '@Url.Action("Test", "Home")'); // 5.傳送XMLHttpRequest xhr.send(null); } </script> </head> <body> <div> <input type="button" value="Send" onclick="ClickSend()" /> </div> </body> </html>
HomeController.cs
using System; using System.Web.Mvc; namespace MVCTest.Controllers { public class HomeController : Controller { public ActionResult Test() { return View(); } [HttpPost] public ActionResult Test(String str) { return Json( "Hello" + str ); } } }
參考來源:
Understanding Callback using XMLHttpRequest
Wekipedia - XMLHttpRequest
留言
張貼留言