使用ASP.NET AJAX异步调用页面中的类方法
该内容参考陈黎夫的博客,详细描述请见他的博客:http://www.cnblogs.com/dflying/archive/2007/06/05/771490.html
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Untitled Page</title>
<script language="javascript" type="text/javascript">
// <!CDATA[

function Button1_onclick() {
var name = $get("txtName").value;
PageMethods.SayHello(name,onSayHelloSucceeded);
}

function onSayHelloSucceeded(result) {
$get("DivResult").innerHTML = result;
}


// ]]>
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager id="ScriptManager1" EnablePageMethods="true" runat="server">
</asp:ScriptManager>
<input id="txtName" type="text" />
<input id="btnName" type="button" value="Say Hello" onclick="return Button1_onclick()" />
<div id="DivResult">
</div>
</div>
</form>
</body>
</html>
代码中的参数来自客户端控件 txtName
如果是服务器端控件<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>,则取值方法为:var name = $get('<%= this.TextBox1.ClientID %>').value;
using System;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.Services;

namespace AspAjax
{
public partial class PageMethod : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

}

[WebMethod]
public static string SayHello(string name)
{
return string.Format("Hello,{0}! Now it is {1}.", name, DateTime.Now);
}
}
}
注意:必须是静态方法才可以实现此功能。为什么要求静态呢?答案请参见赵劼的博客:浅谈实例Page Method到静态Page Method的移植
以下是他博客中的摘要:
静态Page Method与实例Page Method的实现方式有什么区别呢?静态的Page Method的实现原理其实和客户端调用Web Service如出一辙,几乎没有任何的区别。而实例Page Method在调用时和UpdatePanel有些接近——至少在一开始,因为它们为了获得整个控件树的信息,必须将页面上的所有内容,例如所有输入控件的值,连同ASP.NET存放在客户端的ViewState等信息一并发送到服务器端。喔,这不就相当于一个完整的PostBack吗?它与静态Page Method相比,最大的劣势也就在这里:性能。实例Page Method在每次调用时都必须传输更多的数据,在构造一棵完整的控件树,换来的是访问控件树的能力——再明确点说,换来的“只是”访问控件树的能力。其它功能的可以说几乎完全没有,例如对于控件的修改无法输出到客户端。
现在的Page Method已经必须为静态了,那么它和客户端调用Web Service有什么明显的区别的呢?选择哪一个比较好呢?我的答案是:“两者可以说区别”。的确,它们两个再实现上可以说完全相同,它们重用了几乎所有的类,Page Method在ASP.NET 2.0 AJAX Extensions中也使用WebServiceData、WebServiceMethodData用来分析和执行。说到区别,可能只有生成客户端Proxy这一点了吧。Page Method将Proxy直接写在页面上,而Web Service则使用了“.asmx/js”的方式通过<script />元素来引入了客户端Proxy。这么说来,似乎使用Web Service会比较好些——至少生成的Proxy可以利用缓存,不是吗?
总结:想要使用ASP.NET AJAX在客户端JavaScript中异步调用定义在ASP.NET页面中的方法,我们需要:
- 将该方法声明为公有(public);
- 将该方法声明为类方法(C#中的static,VB.NET中的Shared),而不是实例方法;
- 为该方法添加[WebMethod]属性;
- 将页面中ScriptManager控件的EnablePageMethods属性设置为true;
- 在客户端使用如下JavaScript语法调用该页面方法:
PageMethods.[MethodName](param1, param2 …, callbackFunction); - 为客户端异步调用指定回调函数,在回调函数中接收返回值并进一步处理。
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>Untitled Page</title>
<script language="javascript" type="text/javascript">
// <!CDATA[
function Button1_onclick() {
var name = $get("txtName").value;
PageMethods.SayHello(name,onSayHelloSucceeded);
}
function onSayHelloSucceeded(result) {
$get("DivResult").innerHTML = result;
}

// ]]>
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager id="ScriptManager1" EnablePageMethods="true" runat="server">
</asp:ScriptManager>
<input id="txtName" type="text" />
<input id="btnName" type="button" value="Say Hello" onclick="return Button1_onclick()" />
<div id="DivResult">
</div>
</div>
</form>
</body>
</html>代码中的参数来自客户端控件 txtName
如果是服务器端控件<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>,则取值方法为:var name = $get('<%= this.TextBox1.ClientID %>').value;
using System;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.Services;
namespace AspAjax
{
public partial class PageMethod : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
[WebMethod]
public static string SayHello(string name)
{
return string.Format("Hello,{0}! Now it is {1}.", name, DateTime.Now);
}
}
}注意:必须是静态方法才可以实现此功能。为什么要求静态呢?答案请参见赵劼的博客:浅谈实例Page Method到静态Page Method的移植
以下是他博客中的摘要:
静态Page Method与实例Page Method的实现方式有什么区别呢?静态的Page Method的实现原理其实和客户端调用Web Service如出一辙,几乎没有任何的区别。而实例Page Method在调用时和UpdatePanel有些接近——至少在一开始,因为它们为了获得整个控件树的信息,必须将页面上的所有内容,例如所有输入控件的值,连同ASP.NET存放在客户端的ViewState等信息一并发送到服务器端。喔,这不就相当于一个完整的PostBack吗?它与静态Page Method相比,最大的劣势也就在这里:性能。实例Page Method在每次调用时都必须传输更多的数据,在构造一棵完整的控件树,换来的是访问控件树的能力——再明确点说,换来的“只是”访问控件树的能力。其它功能的可以说几乎完全没有,例如对于控件的修改无法输出到客户端。
现在的Page Method已经必须为静态了,那么它和客户端调用Web Service有什么明显的区别的呢?选择哪一个比较好呢?我的答案是:“两者可以说区别”。的确,它们两个再实现上可以说完全相同,它们重用了几乎所有的类,Page Method在ASP.NET 2.0 AJAX Extensions中也使用WebServiceData、WebServiceMethodData用来分析和执行。说到区别,可能只有生成客户端Proxy这一点了吧。Page Method将Proxy直接写在页面上,而Web Service则使用了“.asmx/js”的方式通过<script />元素来引入了客户端Proxy。这么说来,似乎使用Web Service会比较好些——至少生成的Proxy可以利用缓存,不是吗?
本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利
This posting is provided "AS IS" with no warranties, and confers no rights.
This posting is provided "AS IS" with no warranties, and confers no rights.



浙公网安备 33010602011771号