zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C# 文件类的操作---删除
    C#实现Zip压缩解压实例
    UVALIVE 2431 Binary Stirling Numbers
    UVA 10570 meeting with aliens
    UVA 306 Cipher
    UVA 10994 Simple Addition
    UVA 696 How Many Knights
    UVA 10205 Stack 'em Up
    UVA 11125 Arrange Some Marbles
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/blqw/p/Ajax.html
Copyright © 2011-2022 走看看