ExtJs4 筆記(3) Ext.Ajax 對ajax的支援

來源:互聯網
上載者:User
文章目錄
  • 1.非同步請求,發送自訂要求標頭:
  • 2.非同步請求,返回json:
  • 3.非同步檔案上傳
  • 4.非同步請求事件
  • 1.單個元素的及時更新
  • 2.通過提交表單更新
  • 3.周期性更新
《回到系列目錄

本篇主要介紹一下ExtJs常用的幾個對JS文法的擴充支援,包括Ajax封裝,函數事件操作封裝,還有擴充的常用函數等。Ajax服務端互動式操作是提交到.NET MVC。後續服務端互動都採用這一方式實現。

一、ExtJs中的Ajax:Ext.Ajax.request

通過用戶端向服務端發送Ajax請求,可以“直接”調用MVC的action方法,並傳遞參數,action傳回值可以是一般字元串,也可以是json對象。請求可以添加自訂頭資訊。看下面例子:

1.非同步請求,發送自訂要求標頭:

html頁面如下:

[html]

<h1>Ajax服務端請求</h1><div class="content" id="div1"><div>一共發起了<span id="span1" style="color:Red">0</span>次請求。</div></div>

我們先通過一個按鈕單擊事件觸發ajax請求,服務端返回string到用戶端,非同步請求時,為請求添加自訂頭“userHeader”,並在服務端擷取。如下是js代碼:

[Js]

Ext.onReady(function () {    new Ext.Button({        renderTo: "div1",        text: "後台Ajax提交",        handler: function () {            Ext.Ajax.request({                url: 'Ajax_Func1',                headers: {                    'userHeader': 'userMsg'                },                params: { a: 10, b: 20 },                method: 'GET',                success: function (response, options) {                    Ext.MessageBox.alert('成功', '從服務端擷取結果: ' + response.responseText);                },                failure: function (response, options) {                    Ext.MessageBox.alert('失敗', '請求逾時或網路故障,錯誤編號:' + response.status);                }            });        },        id: "bt1"    });});

服務端MVC接受請求的action代碼:

[C#]

        public ContentResult Ajax_Func1(int a, int b)        {            string userHeaderMsg = Convert.ToString(Request.Headers["userHeader"]);            return Content((a + b).ToString() + ",userHeader:" + userHeaderMsg);        }

然後我們在Firefox中調試:自訂要求標頭已被添加。

查看執行結果:

2.非同步請求,返回json:

如果要返回json到用戶端,MVC需要使用JsonResult的acton,自動將C#對象轉換為json格式。用戶端代碼如下:

[Js]

Ext.onReady(function () {    new Ext.Button({        renderTo: "div1",        text: "後台Ajax提交方式2返回JSON",        handler: function () {            Ext.Ajax.request({                url: 'Ajax_Func2',                params: { n: 10 },                method: 'POST',                callback: function (options, success, response) {                    if (success) {                        var responseJson = Ext.JSON.decode(response.responseText);                        Ext.Msg.alert("成功", options.params.n + "的階乘是:<font color='red'>" + responseJson.n1 + "</font><br />"                      + options.params.n + "的累加是:<font color='red'>" + responseJson.n2 + "</font>");                    } else {                        Ext.Msg.confirm('失敗',                                            '請求逾時或網路故障,錯誤編號:[' + response.status + ']是否要重新發送?', function (btn) {                                                if (btn == 'yes') {                                                    Ext.Ajax.request(options);                                                }                                            });                    }                }            });        }    });});

服務端代碼:

[C#]

public JsonResult Ajax_Func2(int n){    int n1 = 1;    int n2 = 0;    for (int i = 1; i <= n; i++)    {        n1 *= i;        n2 += i;    }    var data = new    {        n1 = n1,        n2 = n2    };    return Json(data, JsonRequestBehavior.AllowGet);}

查看執行結果,我們先看看Firefox調試響應的結果,可以查看返回的json內容:

介面執行結果:

3.非同步檔案上傳

ExtJs通過強大的內部封裝,使ajax請求看起來可以直接提交二進位流資料。每當提交檔案資料時,ExtJs會自動建立iframe,在iframe中提交。提交完成後又自動移去,一切顯得天衣無縫。下面示範一個通過非同步請求無重新整理檔案上傳的例子:

[html]

<h1>Ajax檔案上傳</h1><div class="content" id="div2"><form id="form1">請選擇文字檔:<input type="file" name="file" /><input type="button" id="button1" value="上傳" /></form></div>

[Js]

    //檔案上傳    Ext.get("button1").on("click", function () {        Ext.Ajax.request({            url: "Ajax_FileUp",            isUpload: true,            form: "form1",            success: function (response) {                Ext.MessageBox.alert("上傳成功,文字檔內容:", response.responseText);            }        });    });

[C#]

        public ContentResult Ajax_FileUp(HttpPostedFileBase file)        {            System.IO.StreamReader r = new System.IO.StreamReader(file.InputStream, System.Text.UTF8Encoding.Default);            var str = r.ReadToEnd();            return Content(str);        }

提交後我們發現,上傳的文字檔內容已經被正確讀取。

4.非同步請求事件

當發起ajax請求之前,可以監聽beforerequest事件,本例每當發起ajax事件時,都會把計算機+1:

[Js]

    var ajaxCount = 0;    //每當Ajax請求發起時觸發:    Ext.Ajax.on('beforerequest', function () { Ext.get("span1").update(++ajaxCount) }, this);

這樣,每當ajax發起就可以被記錄,可用作日誌等。

二、元素對象Ajax式更新:Ext.Updater,[已棄用]

ExtJs為我們提供了非同步方式更新dom元素內容的支援。這可以用在一些非同步互動性比較強的地方,例如webgame等。我們來看看具體實現方式。

我們先在視圖中寫這樣的html:

[html]

    <div id="div1" title="d1" style="width:50px; height:50px; position:absolute; background-color:Green; top:100px">1</div>    <div id="div2">2</div>    <form id="form1"><input id="a" name="a" value="20" /><input id="b" name="b" value="50" /></form>

1.單個元素的及時更新

現在,我要通過c#在服務端計算a+b的值,然後將結果填到div1元素裡面:

[Js]

Ext.get("div1").getUpdater().update({    url: "Ext/UpdaterFunc",    params: { a: 10, b: 3 }});

[c#]

        public ContentResult UpdaterFunc(int a,int b)        {            return Content("a+b=" + (a + b));        }

頁面載入後,將自動更新div1。再看看另外一種寫法:

[Js]

        Ext.get("div1").load({            url: "Ext/UpdaterFunc",            scripts: true,            params: { a: 10, b: 47 },            text: "請等待..."        });

2.通過提交表單更新

[Js]

Ext.get("div1").getUpdater().formUpdate("form1", "Ext/UpdaterFunc");

效果一樣,只不過提交的參數來源於表單,參數名為對應的name值。

3.周期性更新

[Js]

        //周期性更新        var up = new Ext.Updater("div1");        up.startAutoRefresh(5, "Ext/UpdaterFunc", { a: 10, b: 47 });

這段代碼運行後將每隔5秒鐘更新一次div1,用於需要適時核對服務端和用戶端狀態的情形。

作者:李盼(Lipan)
出處:[Lipan] (http://www.cnblogs.com/lipan/)
著作權聲明:本文的著作權歸作者與部落格園共有。轉載時須註明本文的詳細連結,否則作者將保留追究其法律責任。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.