一段简单的,JavaScript数组,记录一些东西,
var arrError = [];
arrError["a"]=1;
arrError["x"]=0;
.......
之前没有用AJAX,用循环遍历之后用字符串传递给后台,读取
for (var o in arrError) {
str += o + "," + (arrError[o] ? 1 : 0) + "|";
}
这样写,是没有问题的,
将得到"a,1|x,0|"这样的字符串,后台解析。
但是,当加入AJAX后AjaxPro.Utility.RegisterTypeForAjax(typeof(Page1));
这种ajax的代码我用了好久了,调用方法是没有错的。但JavaScript端的,遍历数组,就出问题了。 for (var o in arrError) {
str += o + "," + (arrError[o] ? 1 : 0) + "|";
}
这段代码得出的结果是
clear,1|addRange,1|然后才我原来想要的数组里的内容,调试的时候我设断点看,之前的数组没有那两个方法,现在调试,就有这两个方法了,怎么办?
var arrError = [];
arrError["a"]=1;
arrError["x"]=0;
.......
之前没有用AJAX,用循环遍历之后用字符串传递给后台,读取
for (var o in arrError) {
str += o + "," + (arrError[o] ? 1 : 0) + "|";
}
这样写,是没有问题的,
将得到"a,1|x,0|"这样的字符串,后台解析。
但是,当加入AJAX后AjaxPro.Utility.RegisterTypeForAjax(typeof(Page1));
这种ajax的代码我用了好久了,调用方法是没有错的。但JavaScript端的,遍历数组,就出问题了。 for (var o in arrError) {
str += o + "," + (arrError[o] ? 1 : 0) + "|";
}
这段代码得出的结果是
clear,1|addRange,1|然后才我原来想要的数组里的内容,调试的时候我设断点看,之前的数组没有那两个方法,现在调试,就有这两个方法了,怎么办?
难道加了AJAX,解释JavaScript的解释器变成了AJAXpro.dll解释的了?
跟ajax没什么关系遍历数组还是用 for(var i = 0; i < arrError.length; i++) 吧
arr["汉字"]=123;
这样的啊,这种遍历怎么遍历得到啊
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对象扩展:view sourceprint?01 push: function(o) { 02 this[this.length] = o; 03 }, 04 addRange: function(items) { 05 if(items.length > 0) { 06 for(var i=0; i<items.length; i++) { 07 this.push(items); 08 } 09 } 10 }, 11 clear: function() { 12 this.length = 0; 13 return this; 14 }, 15 shift: function() { 16 if(this.length == 0) { return null; } 17 var o = this[0]; 18 for(var i=0; i<this.length-1; i++) { 19 this = this[i + 1]; 20 } 21 this.length--; 22 return o; 23 } String对象的扩展:view sourceprint?01 trimLeft: function() { 02 return this.replace(/^\s*/,""); 03 }, 04 trimRight: function() { 05 return this.replace(/\s*$/,""); 06 }, 07 trim: function() { 08 return this.trimRight().trimLeft(); 09 }, 10 endsWith: function(s) { 11 if(this.length == 0 || this.length < s.length) { return false; } 12 return (this.substr(this.length - s.length) == s); 13 }, 14 startsWith: function(s) { 15 if(this.length == 0 || this.length < s.length) { return false; } 16 return (this.substr(0, s.length) == s); 17 }, 18 split: function(c) { 19 var a = []; 20 if(this.length == 0) return a; 21 var p = 0; 22 for(var i=0; i<this.length; i++) { 23 if(this.charAt(i) == c) { 24 a.push(this.substring(p, i)); 25 p = ++i; 26 } 27 } 28 a.push(s.substr(p)); 29 return a; 30 } String对象还增加了2个静态方法:view sourceprint?01 format: function(s) { 02 for(var i=1; i<arguments.length; i++) { 03 s = s.replace("{" + (i -1) + "}", arguments); 04 } 05 return s; 06 }, 07 isNullOrEmpty: function(s) { 08 if(s == null || s.length == 0) { 09 return true; 10 } 11 return false; 12 } 可以看到扩展的方法都是C#风格的,使得在javasript中能如C#中一样进行字符串与数组操作。 更重要的是Converter.js中增加了DataTable、DataSet、Dictionary和NameValueCollection,使得我们可以在客户端组装以上对象并在需要的时候发往服务端。可以想象在服务端的ajax方法接受一个DataTable类型的参数,那是如何的愉快。一、DataTable 客户端代码:view sourceprint?01 function SendDataTable() { 02 var dataTable = new Ajax.Web.DataTable(); 03 dataTable.addColumn("id", "System.Int32"); 04 dataTable.addColumn("name", "System.String"); 05 var row = new Object(); 06 row.id = "001"; 07 row.name = "xiaopang"; 08 dataTable.addRow(row); 09 var ret = ZyYz_Default.HanderDataTable(dataTable); 10 alert(ret.value); 11 } 服务端代码:view sourceprint?1 [AjaxPro.AjaxMethod] 2 public int HanderDataTable(DataTable dataTable) 3 { 4 foreach (DataRow dataRow in dataTable.Rows) 5 { 6 //do somethig... 7 } 8 return 1; 9 }二、DataSet(基本同DataTable,只是类型为Ajax.Web.DataSet)三、Dictionary: 客户端代码:view sourceprint?1 function SendDictionary() { 2 var dictionary = new Ajax.Web.Dictionary("Dictionary<STRING string="">", [["004", "xiaopang"], ["005", "xiaopang005"]]); 3 dictionary.add("006", "xiaopang006"); 4 alert("是否存在005元素:" + dictionary.containsKey("005") + "值为:" + dictionary.getValue("005")); 5 var ret = ZyYz_Default.HandDictionary(dictionary).value; 6 alert("Dictionary元素数目:" + ret); 7 }</STRING>服务端代码:view sourceprint?1 [AjaxPro.AjaxMethod] 2 public int HandDictionary(Dictionary<string, string> dictionary) 3 { 4 return dictionary.Count; 5 }四、关于直接传递Class 服务端代码:view sourceprint?01 public class TestClass 02 { 03 public int Id{ get; set; } 04 public string Name { get; set; } 05 } 06 07 [AjaxPro.AjaxMethod] 08 public TestClass GetTestClass() 09 { 10 return new TestClass{ Id =002,Name="oldXiaoPang"}; 11 } 12 13 [AjaxPro.AjaxMethod] 14 public TestClass PutTestClass(TestClass testClass) 15 { 16 testClass.Id = 003; 17 return testClass; 18 } 客户端代码:view sourceprint?1 function GetTestClass() { 2 var testClass = ZyYz_Default.GetTestClass().value; 3 testClass.Name = "newName"; 4 var newTestClass = ZyYz_Default.PutTestClass(testClass).value; 5 alert("原Id为:" + testClass.Id + " 现Id为:" + newTestClass.Id); 6 alert(" 现Name为:" + newTestClass.Name); 7 }
比如像你结果里面的(clear,1|addRange,1|) clear 和 addRange 它本来就存在的结果不对就说明你的数组赋值不对 跟ajax有什么关系呢?
{a:1,x:0}
return (typeof obj == 'function') && obj.constructor == Function;
}
if (isFunction(o)) {
continue;
}
str += o + "," + (arrError[o] ? 1 : 0) + "|";
}
这样不行啊,typeof o 的结果是string并不是function啊
if (arrError.hasOwnProperty(o)) {
continue;
}
也不行啊,直接返回false了