有的時候,我們需要在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
>
這樣就解決問題了.