如果从ajax和web服务(asmx)方法调用不是静态的,为什么代码隐藏方法应该是静态的?

时间:2016-01-21 06:20:23

标签: asp.net-ajax asmx

我遇到过一种情况,我必须使用客户端的ajax调用asp页面代码隐藏方法。我发现方法背后的代码应该是静态的,以便使用ajax从客户端调用,其中ASMX Web服务方法是普通的类方法。

为什么代码隐藏方法应该是静态的,为什么ASMX Web服务方法不是? 是否有任何客观理论在幕后或任何其他理论背后运行?

请帮助我!

3 个答案:

答案 0 :(得分:1)

您可以在问题right here

上找到答案
  

那么,为什么页面方法调用必须是静态的?

     

如果您正在实施页面方法,那么您可能很清楚它们的出色表现。与之相比,它们特别具有高性能   UpdatePanel的部分回发。

     

他们效率很高,主要是因为   它们不要求ViewState进行POST,也不要创建   Page的一个实例,而部分回发同时执行这两个操作   的东西。我们现在知道,页面方法无法创建实例   即使需要,也可以在页面中提供ViewState   请求。

     

这正是他们必须被标记为静态的原因。

     

它们无法与您的Page的实例属性和方法进行交互   class,因为页面方法调用不会创建Page或Page的实例   任何控件。页面方法大致相当于速记   对于独立的Web服务。实际上,ScriptManager甚至会调用   它们与普通的Web服务完全一样。

答案 1 :(得分:1)

您通过AJAX调用的方法称为Page methods,因为它们属于System.Web.UI.Page类。如果您阅读ASP.NET Page Lifecycle,您将看到Page类在生命周期中实例化,一旦完成其工作,所有需要重新定时的数据都会被序列化在ViewState中。在回发时,此数据通过隐藏的input字段发送回服务器,并用于创建Page类的另一个实例。

Page类无法从您的代码中实例化,因为您在代码中定义的方法属于Page类。这就是为什么必须将这些方法定义为static,因为静态方法不需要其类的实例才能被调用。您几乎可以将它们视为原始Web服务。

ASMX服务等Web服务的方法不必是静态的,因为它们不受此限制的限制。它们可以由它们自己的应用程序中的进程实例化。

答案 2 :(得分:0)

来自:Call server method without refresh page

您无法从其代码隐藏更改页面。这是因为该方法是静态的。因为它是静态的该方法属于页面的每个实例。如果有多个人打开了该页面,该方法将无法知道要更新的页面。所以你必须将信息发送回ajax电话。

还:http://encosia.com/why-do-aspnet-ajax-page-methods-have-to-be-static/