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>
<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;
}
}
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());
}
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).
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也是知道的.如下
但並沒有給出具體方案來解決.
以下是網上找到的解決方法如下:
1.先從microsoft網站download AJAX Futures CTP
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>
<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>
這樣就解決問題了.