AjaxPro客户端框架总结

    由于微软构建asp.net 2.0时对ajax技术的不重视,在04、05年ajax风起云涌之时,在asp.net出现了AjaxPro这个Ajax框架,虽然随着asp.net ajax的发布,AjaxPro被强大的asp.net ajax的光芒覆盖,但AjaxPro的简单易用性方面还是非常不错的。

    AjaxPro在客户端会输出三个Core.ashx、Converter.ashx和Prototype.ashx三个文件,其实就是javasript文件。其中Prototype.js对Object建立了extend,然后在extend上增加了Apply和Bin方法,之后的Ajax调用的核心文件Core.ashx就是基于extend上进行的。Prototype.js里对Array,String进行扩展并增加了2个事件方面的方法addEvent与removeEvent方法。

    Array对象扩展:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    push: function(o) {
    this[this.length] = o;
},
addRange: function(items) {
    if(items.length > 0) {
        for(var i=0; i<items.length; i++) {
            this.push(items[i]);
        }
    }
},
clear: function() {
    this.length = 0;
    return this;
},
shift: function() {
    if(this.length == 0) { return null; }
    var o = this[0];
    for(var i=0; i<this.length-1; i++) {
        this[i] = this[i + 1];
    }
    this.length--;
    return o;
}

    String对象的扩展:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    trimLeft: function() {
    return this.replace(/^\s*/,"");
},
trimRight: function() {
    return this.replace(/\s*$/,"");
},
trim: function() {
    return this.trimRight().trimLeft();
},
endsWith: function(s) {
    if(this.length == 0 || this.length < s.length) { return false; }
    return (this.substr(this.length - s.length) == s);
},
startsWith: function(s) {
    if(this.length == 0 || this.length < s.length) { return false; }
    return (this.substr(0, s.length) == s);
},
split: function(c) {
    var a = [];
    if(this.length == 0) return a;
    var p = 0;
    for(var i=0; i<this.length; i++) {
        if(this.charAt(i) == c) {
            a.push(this.substring(p, i));
            p = ++i;
        }
    }
    a.push(s.substr(p));
    return a;
}

    String对象还增加了2个静态方法:

1
2
3
4
5
6
7
8
9
10
11
12
    format: function(s) {
    for(var i=1; i<arguments.length; i++) {
        s = s.replace("{" + (i -1) + "}", arguments[i]);
    }
    return s;
},
isNullOrEmpty: function(s) {
    if(s == null || s.length == 0) {
        return true;
    }
    return false;
}

    可以看到扩展的方法都是C#风格的,使得在javasript中能如C#中一样进行字符串与数组操作。 更重要的是Converter.js中增加了DataTable、DataSet、Dictionary和NameValueCollection,使得我们可以在客户端组装以上对象并在需要的时候发往服务端。可以想象在服务端的ajax方法接受一个DataTable类型的参数,那是如何的愉快。

一、DataTable

    客户端代码:

1
2
3
4
5
6
7
8
9
10
11
function SendDataTable() {
    var dataTable = new Ajax.Web.DataTable();
    dataTable.addColumn("id", "System.Int32");
    dataTable.addColumn("name", "System.String");
    var row = new Object();
    row.id = "001";
    row.name = "xiaopang";
    dataTable.addRow(row);
    var ret = ZyYz_Default.HanderDataTable(dataTable);
    alert(ret.value);
}

    服务端代码:

1
2
3
4
5
6
7
8
9
[AjaxPro.AjaxMethod]
public int HanderDataTable(DataTable dataTable)
{
    foreach (DataRow dataRow in dataTable.Rows)
    {
        //do somethig...
    }
    return 1;
}

二、DataSet(基本同DataTable,只是类型为Ajax.Web.DataSet)

三、Dictionary:

    客户端代码:

1
2
function SendDictionary() {
    var dictionary = new Ajax.Web.Dictionary("Dictionary<string string="">", [["004", "xiaopang"], ["005", "xiaopang005"]]); dictionary.add("006", "xiaopang006"); alert("是否存在005元素:" + dictionary.containsKey("005") + "值为:" + dictionary.getValue("005")); var ret = ZyYz_Default.HandDictionary(dictionary).value; alert("Dictionary元素数目:" + ret); }</string>

服务端代码:

1
2
3
4
5
[AjaxPro.AjaxMethod]
public int HandDictionary(Dictionary<string, string> dictionary)
{
    return dictionary.Count;
}

四、关于直接传递Class


    服务端代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class TestClass
{
    public int Id{ get; set; }
    public string Name { get; set; }
}
 
[AjaxPro.AjaxMethod]
public TestClass GetTestClass()
{
    return new TestClass{ Id =002,Name="oldXiaoPang"};
}
 
[AjaxPro.AjaxMethod]
public TestClass PutTestClass(TestClass testClass)
{
    testClass.Id = 003;
    return testClass;
}

    客户端代码:

1
2
3
4
5
6
7
function GetTestClass() {
    var testClass = ZyYz_Default.GetTestClass().value;
    testClass.Name = "newName";
    var newTestClass = ZyYz_Default.PutTestClass(testClass).value;
    alert("原Id为:" + testClass.Id + " 现Id为:" + newTestClass.Id);
    alert(" 现Name为:" + newTestClass.Name);
}

    关于core.js的ajax核心方法还没有仔细看。

posted @   小胖2010  阅读(628)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示