ASP.NET 3.5 下 AJAX引用PageMethod方法描述

有的時候,我們需要在page的頁面中調用后臺的方法.如下方法可以實現.

1.啟用AJAX對頁面的支持.

在web.config的system.web標籤中加入以下標籤

 

代码
     < httpHandlers >
      
< add verb = " GET,HEAD "  path = " ScriptResource.axd "  type = " System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 "  validate = " false " />
    
</ httpHandlers >
    
< httpModules >
      
< add name = " ScriptModule "  type = " System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35 " />
    
</ httpModules >

 

 

2.啟用ScriptManage的EnablePageMethod屬性.

 

            ScriptManager.GetCurrent(Page).EnablePageMethods  =   true ;

 

 

3.在後臺代碼中添加需要調用的方法.

ps:注意要加上webmethod以及static.

代码
        [System.Web.Services.WebMethod] 
        
public   static  DataTable GetData( string  empno,  string  cname)
        {
            
try
            {
                DataTable dt 
=   new  DataTable();
                dt.Columns.Add(
new  DataColumn(empno,  typeof ( string )));
                dt.Columns.Add(
new  DataColumn(cname,  typeof ( string )));
                
return  dt;                
            }
            
catch
            {
                
return   null ;
            }
        }

 

 

4.在page頁面中的javascript中調用這個方法.

 

代码
function GetData() {
            PageMethods.GetData(
            document.getElementById(
" <%=TextBox_EmpNo.ClientID %> " ).value,
            document.getElementById(
" <%=TextBox_CName.ClientID %> " ).value,
            onSuccess);
        }
        function onSuccess(result) {
            
if  (result  !=   null ) {
                var dt 
=  result; 
                
if  (dt  !=   null   &&  typeof (dt)  ==   " object " ) {
                    var innerHtml 
=   new  Sys.StringBuilder( " <OL> " );
                    
for  (var i  =   0 ; i  <  dt.rows.length; i ++ ) {
                        var empid 
=  dt.rows[i].employee_id;
                        var chname 
=  dt.rows[i].chname;
                        innerHtml.append(String.format(
" <LI><INPUT type='checkbox' id='All_{0},{1}<BR>{2}'>{3},{4}<br>{5}</LI> " , chname, empid, email, chname, empid, email));
                    }
                    innerHtml.append(
" </OL> " );
                    document.getElementById(
" PH " ).innerHTML  =  innerHtml;
                }
            }
            
else  {
                alert(
" Error " );
                
return   false ;
            }
        }
        function onFailed(error) {
            alert(error.get_message());
        }

 

 

PS:注意PageMethods這個類是系統自動註冊生成的,它把所有標記為webmethod的方法歸在內類中.

 

代码
使用PageMethods調用的方法如下:
PageMethods.[MethodName](parameter1, parameter2, …, SuccessMethod, FailedMethod, userContext);
其中
Parameter?為與Server端一一對應的參數.
SuccessMethod,必需,WebMethod正確返回時的回調函數,原型為onSuccess(result).
FailedMethod,非必需,WebMethod出錯返回時的回調函數,原形為onFailed(error).
 

 

 

以上事情做完后,如果調用方法返回類型不是DataSet / DataTable / DataRow 等之類的數據類型的話,那麼效果也就出來了.

但是如果返回的是DataSet/DataTable/DataRow則會返回一個錯誤.

 

A circular reference was detected  while  serializing an object ...

 

這個問題Microsoft也是知道的.如下

http://connect.microsoft.com/VisualStudio/feedback/details/535133/error-a-circular-reference-was-detected-while-serializing-an-object-of-type-system-data-dataview

但並沒有給出具體方案來解決.

以下是網上找到的解決方法如下:

1.先從microsoft網站download AJAX Futures CTP

http://www.microsoft.com/downloads/details.aspx?FamilyID=4cb52ea3-9548-4064-8137-09b96af97617&displaylang=en

2.將Microsoft.Web.Preview.dll文件copy到project的bin目錄下.

3.修改web.config,添加如下標籤.

 

代码
  < system.web.extensions >
    
< scripting >
      
< webServices >
        
< jsonSerialization  maxJsonLength ="500000000" >
          
< converters >
            
< add  name ="DataSetConverter"  type ="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter, Microsoft.Web.Preview, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            
< add  name ="DataRowConverter"  type ="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter, Microsoft.Web.Preview, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
            
< add  name ="DataTableConverter"  type ="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter, Microsoft.Web.Preview, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
          
</ converters >
        
</ jsonSerialization >
      
</ webServices >
    
</ scripting >
  
</ system.web.extensions >

 

 

這樣就解決問題了.

 

你可能感兴趣的:(asp.net)