展现Ajax
关键词: Ajax的一些高级功能的展现
说明:这一篇文字是对Ajax.net的一些功能介绍,笔者只是对原文的一种摘录而已,为了是方便阅读.
摘录的过程中略有删节,同时注意原文中有一些笔误,在摘录时也做了修正.
愿共同学习Ajax.net的同仁提供更多宝贵想法与珍贵资源!
1
使用Ajax:
2
1.使用Unicode字符发送反馈.
3
这个例子发送一个Form到Server端,调用Server端的Test1方法,并返回一个HTML的字符串.
4
5
在Server端有一个标准的方法,附加有一个额外的属性:
6
[Ajax.AjaxMethod]
7
public string Test1(string firstName, string familyName, string email, string comment)
8
{
9
string html = "";
10
11
html += "Hello " + firstName + " " + familyName + "<br>";
12
html += "Thank you for your comment <b>";
13
html += System.Web.HttpUtility.HtmlEncode(comment);
14
html += "</b>.";
15
16
return html;
17
}
18
19
客户端调用:
20
Test1:function(firstName,familyName,email,comment,callback,context){
21
return new ajax_request(this.url + '?_method=Test1&_session=no',
22
'firstName=' + enc(firstName)+ '\r\nfamilyName=' +
23
enc(familyName)+ '\r\nemail=' + enc(email)+ '\r\ncomment=' + enc(comment),
24
callback,
25
context);
26
27
其中callback定义对返回结果的处理.
28
2.使用自定义的类型为参数:发送一个真正的.net对象到Server端处理.
29
Client端调用:
30
var d = new DateTime(2005,08,30,0,0,0);
31
DemoMethods.Test2(d,callback);
32
Server端:
33
[Ajax.AjaxMethod]
34
public string Test2(DateTime d)
35
{
36
d = d.AddDays(1);
37
return "The next day will be " + d.ToLongDateString() + ".";
38
}
39
40
目前已经做了类型转化的有:(要实现类型转换的兼容,IAjaxObjectConverters是必要的接口)
41
- System.Collections.ArrayList
42
- System.Data.DataSet/DataTable/DataRow
43
- System.DateTime/TimeSpan
44
- System.Array
45
3.使用System.Data.DataSet对象来填充下拉框
46
Client端调用,当Server端返回一个DataSet时,我们的callback函数这么写:(把其中的res.value当作DataSet处理)
47
function callback(res)
48
{
49
var html = [];
50
for(var i=0; i<res.value.Tables[0].Rows.length; i++)
51
html[html.length] = "<option>" + res.value.Tables[0].Rows[i].Country + "</option>";
52
document.getElementById("display").innerHTML = "<select id=\"sel\">" + html.join("") + "</select>";
53
}
54
4.注意处理Server端产生的Ajax异常:返回值的error.
55
如果Server端产生了Ajax异常,那么我们在处理返回值的时候可以加以识别,callback函数:
56
function callback(res)
57
{
58
if(res.error != null){
59
alert(res.error); //处理错误的方法
60
}
61
}
62
5.存取SessionState,对于SessionState访问需要AjaxMethod方法带有HttpSessionStateRequirement.ReadWrite的参数说明
63
例如Server端:
64
[Ajax.AjaxMethod(HttpSessionStateRequirement.ReadWrite)]
65
public void Test5(string value)
66
{
67
System.Web.HttpContext.Current.Session["example"] = value;
68
}
69
[Ajax.AjaxMethod(HttpSessionStateRequirement.Read)]
70
public string Test6()
71
{
72
if(System.Web.HttpContext.Current.Session["example"] != null)
73
return (string)System.Web.HttpContext.Current.Session["test"];
74
return "First set the value
";
75
}
76
6.一次请求的处理进行中,耗费时间较长,但并不影响其他请求或操作的进行.他们可以是同步进行的.
77
[Ajax.AjaxMethod]
78
public void Test7()
79
{
80
int c = 0;
81
do
82
{
83
System.Threading.Thread.Sleep(1000);
84
c++;
85
}while(c < 10);
86
}
87
当该请求完成的时候,他会触发回调callback函数的执行,所以不会引起network tracffic的发生.
88
显然,这个请求需要耗费10秒,但是他的处理并不影响别的请求的进行,客户端并不会等待,而是同步进行别的活动.
89
90
7.在Client端使用Context,利用context存储一定的信息:
91
<script language="javascript">
92
function test8(ele)
93
{
94
DemoMethods.Test8(test8_callback, ele); // the server-side method has no arguments!
95
}
96
function test8_callback(res)
97
{
98
if(res.error == null && res.context != null)
99
res.context.innerHTML = res.value;
100
}
101
</script>
102
<span onclick="test8(this);">Element1</span>
103
<span onclick="test8(this);">Element2</span>
104
105
在这个例子中,我们就把span区域的对象作为请求的context传给请求函数,当回调callback函数接受结果时,结果中也包含这个context,
106
因此可以方便把值设给它.
107
8.从Server端返回数组&System.Collections.ICollection对象.
108
[Ajax.AjaxMethod]
109
public System.Collections.Specialized.StringCollection Test9()
110
{
111
System.Collections.Specialized.StringCollection s = new System.Collections.Specialized.StringCollection();
112
s.Add("Michael");
113
s.Add("Hans");
114
return s;
115
}
116
117
[Ajax.AjaxMethod]
118
public object[] Test10()
119
{
120
object[] o = new object[3];
121
o[0] = "Michael";
122
o[1] = DateTime.Now;
123
o[2] = true;
124
return o;
125
}
126
当然实现了ICollection接口的类都是可以的,比如ArrayList,这时我们在Client端存取的方法:
127
128
function test11_callback(res)
129
{
130
if(res.value[2]) // bolean
131
alert(res.value[1].toLocaleString()); // date
132
alert(res.value[3].FirstName + " + " + res.value[4].FirstName);
133
}
134
135
也就是说返回的value是一个数组,我们通过[]的方法存取.
136
9.增加自己扩展的支持类型,需要实现IAjaxObjectConverters,增到系统中,需要修改web.config文件,
137
在ajaxConverters中用add项增加Converter,用remove项删除已有的Converter:
138
<configuration>
139
<configSections>
140
<sectionGroup name="ajaxNet">
141
<section name="ajaxSettings" type="Ajax.AjaxSettingsSectionHandler, Ajax" />
142
<section name="ajaxConverters" type="Ajax.AjaxConverterSectionHandler, Ajax" />
143
</sectionGroup>
144
</configSections>
145
<ajaxNet>
146
<ajaxConverters>
147
<add type="Namespace.Class1, Assembly" />
148
<remove type="Ajax.JSON.DataSetConverter, Ajax" >
149
</ajaxConverters>
150
</ajaxNet>
151
</configuration>
152
153
10.从Server端返回自定义的类对象,这个对象需要申明为Serializable的,而在Client端对它的操作和在Server端的操作是一样的:
154
Server:
155
[Serializable]
156
public class Person
157
{
158
public string FirstName;
159
public string FamilyName;
160
public int Age = 0;
161
public Person NewChild()
162
{
163
Person p = new Person();
164
p.FamilyName = FamilyName;
165
return p;
166
}
167
public Person[] Children = null;
168
}
169
Client处理返回回来的Person对象:
170
function test12_callback(res)
171
{
172
var s = res.value.FirstName + " " + res.value.FamilyName + ":\r\n";
173
for(var i=0; i<res.value.Children.length; i++)
174
s += "\t" + res.value.Children[i].FirstName + "\r\n";
175
alert(s);
176
}
177
11.返回一个图片:
178
Server端:
179
[Ajax.AjaxMethod]
180
public System.Drawing.Bitmap Test16()
181
{
182
Bitmap bmp = new Bitmap(200, 50);
183
Graphics g = Graphics.FromImage(bmp);
184
g.FillRectangle(new SolidBrush(Color.Yellow), 0, 0, 199, 49);
185
g.DrawString(DateTime.Now.ToString(), new Font("Arial", 10), new SolidBrush(Color.Red), 10, 10);
186
return bmp;
187
}
188
Client端:
189
function test16_callback(res)
190
{
191
if(typeof(res.value) == 'object')
192
document.getElementById("imageholder").appendChild(res.value);
193
}
194
其中imageholder是一个div标签区域.
195
196
12.使用数组作为参数:
197
在Server端有Ajax方法:
198
[Ajax.AjaxMethod]
199
public string Test18(string[] s)
200
{
201
string r = "";
202
foreach(string ss in s)
203
r += "<p>" + ss + "</p>\r\n";
204
return r;
205
}
206
在Client端可以这样调用:
207
alert(DemoMethods.Test18( ["aaaa","bbbb","ccc\"ccccc"] ).value);
208
同时也支持int[],其他的类型慢慢也会加入到Ajax中来
209
13.传递HtmlControl到Server端,处理完了并返回.
210
Server端返回一个新建的HtmlSelect:
211
[Ajax.AjaxMethod]
212
public System.Web.UI.HtmlControls.HtmlSelect Test19(string car)
213
{
214
System.Web.UI.HtmlControls.HtmlSelect control = new System.Web.UI.HtmlControls.HtmlSelect();
215
switch(car)
216
{
217
case "VW":
218
control.Items.Add("Golf");
219
control.Items.Add("Passat");
220
control.Items.Add("Beetle");
221
control.Items.Add("Phaeton");
222
break;
223
224
case "Mercedes":
225
control.Items.Add("S Class");
226
control.Items.Add("E Class");
227
control.Items.Add("A Class");
228
control.Items.Add("M Class");
229
break;
230
case "Citroen":
231
control.Items.Add("C3 Pluriel");
232
control.Items.Add("C5 Break");
233
control.Items.Add("C8");
234
control.Items.Add("Berlingo");
235
break;
236
}
237
return control;
238
}
239
客户端接受到这个控件,并放在一个Span区域内(id='ele'):
240
var res = Test19("VW");
241
var ele = document.getElementById('ele');
242
ele.innerHTML = res.value;
243
完成了从server端接受一个Html控件的过程,对于所有的HtmlControls亦是如此.
244
14.缓存请求,以节约CPU时间:
245
对于某些频繁的请求,如果缓存下来的结果也满足要求的话,那么缓存结果将使得CPU时间得到节约.
246
要缓存很简单,只需要在Server的方法上加上缓存时间就可以,缓存时间以秒为单位(sec):
247
[Ajax.AjaxMethod(30)]
248
public System.DateTime Test20()
249
{
250
return DateTime.Now;
251
}
252
在第一次请求后的30秒内,任何的请求结果都是第一次请求的缓存.
posted on 2007-07-03 13:07
TRE-China R&D 阅读(410)
评论(0) 编辑 收藏 引用 所属分类:
AJAX 、
C#