• 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('', ''));
    
                        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('', ''));
    
                                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('') + '&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

  • 相关阅读:
    tlb、tlh和tli文件的关系
    String算法
    Reverse A String by STL string
    windows内存管理复习(加深了理解得很!)
    [转载]有关DLL中New和外部Delete以以及跨DLL传递对象的若干问题
    顺势工作时间
    C++箴言:绝不在构造或析构期调用虚函数
    inline函数复习
    从编译器的角度更加深入考虑封装的使用
    复习:constructor和destructor的compiler实现
  • 原文地址:https://www.cnblogs.com/blqw/p/Ajax.html
Copyright © 2020-2023  润新知