Web GIS 涉及到的常见Ajax框架 及 问题处理集锦

 

 

一、Asp.net 在使用AjaxPro(Ajax.net Professional)框架时。
      遇到如下问题:在js中使用同步的方式调用后台.cs的方法时,定位到"timeout: function() { …… var r = this.onTimeout(this.duration, this) ; ……}",总是报错如下:"Microsoft JScript 运行时错误: 缺少对象"。
     解决的方法如下:
     1、使用异步回调可以解决问题。
     2、直接在Asp,net中修改AjaxPro源文件代码中的的core.js,然后rebulid重建成dll,引用编译后的AjaxPro.dll。修改的内容: 是在timeout: function() 中将"var r = this.onTimeout(this.duration, this) ;"放在try{  } catch (error) { } 中 即可。

AjaxPro源文件下载地址是:    
 http://ajaxpro.codeplex.com/Project/Download/SourceControlFileDownload.ashx?ProjectName=AjaxPro&changeSetId=46947

   

     遇到的问题二:Microsoft JScript 运行时错误: 'Demo'(即后台类名) 未定义:
     可能的原因:

      1、在web.config未配置,添加<httpHandlers> <add verb="POST,GET" path="ajaxpro/*.ashx"……>;

      2、以http形式建的项目,将其改为文件形式的项目。


  二、关于Asp.Net Ajax框架下 前台JavaScript 和 后台.cs 之间的复杂数据类型(如类、struct等,这里以实体类为例子)的通
用性。
      使用了ASP.NET AJAX框架后,在JavaScript中调用后台WebService方法非常方便,可以看做通过类名ClassName“直接调用”。那么,这里引出了一个问题:调用方法就涉及到参数的传递,而JavaScript和C#毕竟是两种不同的语言,数据类型怎么沟通?在后台定义实体类类型,但是JavaScript可不知道这种定义,也没有相应数据类型;同样的,在后台也无法识别前台JavaScript定义的数据类型。主要有两个考虑方向:
      1.前台JavaScript 使用后台.cs 定义的类对象。
         以webservice中js使用含有返回值为 类对象 为参数的方法为例。思想如下:
         在Asp.net Ajax框架下后台和前台之间的数据是通过JSON格式交换的,也就是说后台这个类务必具有可序列化(可以加上"[Serializable]"标注),如有一些简单的数据类型构成。此时JSON格式数据在js可以直接使用,如var student(是webservice返回的JSON格式数据),可以"student.name" 格式使用。
      2.后台.cs 使用前台JavaScript 定义的复杂类型。
         以webservice中js调用含有以 类对象 为参数的方法为例。步骤如下:
         a、在后台新建该对象的一个C#类,例如为StudentInfo.cs 。这里需要注意是:给该类开始位置注上"[Serializable]";每
个属性都有get和set,即可设置也可读取;必须有一个无参数的构造函数。
         b、添加webservice,给你的webservice类头上添加[GenerateScriptType(typeof(StudentInfo))]标注,并设置StudentInfo中的所有属性有get和set标签,为什么呢?因为:
ASP.NET AJAX会在运行时自动为我们在js上生成一个JavaScript版本的StudentInfo类,这样就在js上使用"StudentInfo"了。
         假如,这里webservice类中有个[WebMethod]方法 method1(StudentInfo info)。
         c、在js中使用该webservice中带'StudentInfo'参数的method1。
         定义如下 var student=new StudentInfo(); 并设置他的相关属性,然后传递给后台就可以了。

 

三、JS 使用调用webservice实现ajax 相关问题集

     1、运行到js使用webservice类名处时,出现webservice类名" 未定义"的错误。

      原因: 错误的更本原因是js无法识别webservie类。     

      排除方法: a、配置相关:是否在webservice类表示为javascript,即加上[System.Web.Script.Services.ScriptService];在前台添加对webservice的应用<asp:ServiceReference Path="……/*.asmx"/> 。  

                     b、可识别相关:如果需要使用webservice的命名空间和webservice的namespace不同的话,需要在js使用类名前添加namespace;还有保证你的webservice可以正常访问,你可以看下这个webservice的URL是否可以访问。

   

     2、无法在js中使用webservice方法,调试到调用webservice语句时不会报错,但是整个js函数段完成时报错,报错如下图:

     原因:跨域访问

     解决方法: 调用webservice方法的js的应用程序,必须是基于Http的web站点网站(可能称为:ASP.NET AJAX Enabled Web Site),需要注意,添加new web site -->ASP.net web site 。如果是基于文件系统的web网站,或者是web应用程序(ASP.net web application)都可能出现上述问题。

     注意点: 如果在js中使用的webservice还有返回值的话,使用异步回调。如:

                 JS: webSrvNameSpace.webSrvClass.getHello(onReslut) ;  function onReslut(res){ // do something  } //回调处理函数

 

        

 

 

posted @ 2010-01-09 21:49  爱图--UpdooGIS  阅读(578)  评论(0编辑  收藏  举报