posts - 134,  comments - 22,  trackbacks - 0
展现Ajax
关键词: Ajax的一些高级功能的展现                                           
说明:这一篇文字是对Ajax.net的一些功能介绍,笔者只是对原文的一种摘录而已,为了是方便阅读.
摘录的过程中略有删节,同时注意原文中有一些笔误,在摘录时也做了修正.
愿共同学习Ajax.net的同仁提供更多宝贵想法与珍贵资源!
  1使用Ajax:
  21.使用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定义对返回结果的处理.
 282.使用自定义的类型为参数:发送一个真正的.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
 453.使用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 }
 544.注意处理Server端产生的Ajax异常:返回值的error.
 55 如果Server端产生了Ajax异常,那么我们在处理返回值的时候可以加以识别,callback函数:
 56 function callback(res)
 57 {
 58  if(res.error != null){
 59   alert(res.error); //处理错误的方法
 60  }
 61 }
 625.存取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 }
 766.一次请求的处理进行中,耗费时间较长,但并不影响其他请求或操作的进行.他们可以是同步进行的.
 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
 907.在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 因此可以方便把值设给它.
1078.从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是一个数组,我们通过[]的方法存取.
1369.增加自己扩展的支持类型,需要实现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
15310.从Server端返回自定义的类对象,这个对象需要申明为Serializable的,而在Client端对它的操作和在Server端的操作是一样的:
154Server:
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 }
169Client处理返回回来的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 }
17711.返回一个图片:
178 Server端:
179 [Ajax.AjaxMethod]
180 public System.Drawing.Bitmap Test16()
181 {
182  Bitmap bmp = new Bitmap(20050);
183  Graphics g = Graphics.FromImage(bmp);
184  g.FillRectangle(new SolidBrush(Color.Yellow), 0019949);
185  g.DrawString(DateTime.Now.ToString(), new Font("Arial", 10), new SolidBrush(Color.Red), 1010);
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
19612.使用数组作为参数:
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中来
20913.传递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亦是如此.
24414.缓存请求,以节约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 阅读(375) 评论(0)  编辑 收藏 引用 所属分类: AJAXC#
只有注册用户登录后才能发表评论。