ASP.NET中一種超簡單的Ajax解決方案


為什么是Ajax2?

因為之前有一個blqw.Ajax,並且已經在項目中投入使用了,但是沒有這個方便,這個是后來才弄的,為了紀念第一版的blqw.Ajax,所以這個就2了...

話說看了評論才發現,原來之前有組件已經實現類似的功能了

不過我不是很理解的是AjaxPro為什么一定要配置Handler,直接在后端文件中完成不好嗎?這樣看,似乎我這個也還是有點自己的特色的...

  調用方式

blqw.Ajax2調用方式

都說了是超簡單的,所以調用起來就一定是超簡單的了.....

建立一個web項目

引用blqw.Ajax2 

對了,聰明你的一定已經知道了,我只是向頁面中注入了一段js,利用了一個同步ajax請求模擬出的這樣一個效果而已

技術上實現並不難

    window.blqw = window.blqw || {};

    blqw.Ajax = blqw.Ajax || {};

    blqw.Ajax.GetRequest = function () {

        if (window.ActiveXObject) {

            try {

                return new ActiveXObject('Msxml2.XMLHTTP');

            } catch (e) {

                return new ActiveXObject('Microsoft.XMLHTTP');

            }

        }

        else if (window.XMLHttpRequest) {

            return new XMLHttpRequest();

        }

    }



    blqw.Ajax.Throw = function(e){{

            function AjaxError(message,stack,type){{

                this.name = 'AjaxError';

                this.type = type;

                this.message = message;

                this.stack = stack;

                this.innerError = null;

                this.toString = function () {{

                                    return 'ajaxerr:' + this.message;

                                }};

            }};

            var err = new AjaxError(e.message,e.stack,e.type);

            var e1 = err;

            while(e.innerError){{

                e = e.innerError;

                e1.innerError = new AjaxError(e.message,e.stack,e.type);

                e1 = e1.innerError;

            }}

            return err;

        }}



    blqw.Ajax.Exec = function (method, args) {



            var getStr = function (obj) {

                if (obj == null) return '';

                var type = typeof (obj);

                switch (type) {

                    case 'number':

                    case 'boolean':

                        return obj.toString();

                    case 'string':

                        return encodeURIComponent(obj.replace('\0', '\0\0'));

                    case 'undefined':

                        return 'undefined';

                    case 'function':

                        try {

                            return arguments.callee(obj());

                        } catch (e) {

                            return 'null';

                        }

                    case 'object':

                        type = Object.prototype.toString.apply(obj);

                        switch (type) {

                            case '[object Date]':

                                return encodeURIComponent(obj.getFullYear() + '-' +

                            (obj.getMonth() + 1) + '-' +

                            obj.getDate() + ' ' +

                            obj.getHours() + ':' +

                            obj.getMinutes() + ':' +

                            obj.getSeconds() + '.' +

                            obj.getMilliseconds());

                            case '[object RegExp]':

                                return encodeURIComponent(obj.toString().replace('\0', '\0\0'));

                            case '[object Array]':

                                var arr = [];

                                for (var i in obj)

                                    arr.push(arguments.callee(obj[i]));

                                return arr.join(',');

                            case '[object Object]':

                                return '[object Object]';

                        }

                        break;

                }

            }

            var arr = [];

            for (var i = 0; i < args.length; i++) {

                arr.push(getStr(args[i]));

            }



            url = window.location.href;

            var req = blqw.Ajax.GetRequest();

            req.open('POST', url, false);

            req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');

            var ret = req.send('blqw.ajaxdata=' + arr.join('\0') + '&blqw.ajaxmethod=' + method);

            if (req.status == 200) {

                var html = req.responseText;

                var data = eval('(' + html+ ')');

                if ('v' in data) {

                    eval(data.v);

                } 

                if ('e' in data) {

                    throw blqw.Ajax.Throw(data.e);

                } else {

                    return data.d;

                }

            } else {

                alert('出現錯誤');

            }

        } 

window.GetString=function(){return blqw.Ajax.Exec('GetString',arguments);}
向頁面中添加的js

事實上正式使用的js是壓縮了的

  特點

當然,如果只有這樣,你們一定就罵我的......

我為他增加了一些實用的方法

1.沒有form也可以

  如果頁面中沒有form,只要把<% blqw.Ajax2.Register(this); %>寫在aspx頁面中就可以了

2.返回類型object

3.異常處理

4.方便的js寫入

  寫入alert

  寫入變量 或 修改變量

  寫入js

 

  缺陷

  1. 參數僅支持System下的基礎類型
  2. Ajax請求中無法取消
  3. 不支持ref out params 這些東西....
  4. 安全性不夠,需要自己在代碼中實現(關於這點我自己也一直在糾結,如果園友們有好的方案可以提點一下我啊)

 

  Demo下載

blqw.Ajax2Demo.rar

  源碼下載

https://code.csdn.net/jy02305022/blqw-ajax2

 事實上他只有2個文件

Ajax2.cs

AjaxMethod.cs


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM