風之力

导航

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>

 

 

這樣就解決問題了.

 

posted on 2010-03-29 16:33  ZY.Zhou  阅读(453)  评论(0编辑  收藏  举报