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

來源:互聯網
上載者:User

有的時候,我們需要在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>

 

 

這樣就解決問題了.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.