如何在ASP.NET AJAX上的保留函数pageLoad中检查页面是否回发

时间:2020-03-05 18:46:48  来源:igfitidea点击:

我正在寻找一种在pageLoad()中进行检查的方法,该方法是在加载事件期间是否由于回发/异步回发或者由于首次加载和访问而引发的。

这类似于页面后面代码中的" Page.IsPostback"属性。

TIA,
瑞奇

解决方案

回答

如果是回发/回调,并且服务器上的javascript可以检查该值,则可以在服务器端将其设置为已知值的隐藏输入。

就是说,我真的希望有一个针对客户的解决方案。

编辑:@mmattax我相信他正在寻找与之等效的JavaScript客户端解决方案。

回答

我们可以做的就是连接Sys.Application类的load事件。然后,我们可以使用Sys.ApplicationLoadEventArgs类的isPartialLoad属性。我相信这会让我们知道我们是否处于异步回发中。

要知道我们是否在回发中,我们必须在服务器端代码中进行处理并将其发送给客户端。

回答

我们仍然可以在异步调用期间使用Page.IsPostback。

回答

@Darren:感谢回答。我曾尝试使用事件参数ApplicationLoadEventArgs作为参数创建pageLoad(请参见下文)。但是根据此:

对于服务器的所有回发都会引发load事件,其中包括异步回发。

如我们所指出的,isPartialLoad属性并不涵盖所有回发方案。如果事件参数还包含isPostback属性,那就太好了。

function pageLoad(sender, arg) {
      if (!arg.get_isPartialLoad()) {
          //code to be executed only on the first load
      }
   }

@mmattax:我正在寻找可以从客户端(javascript)调用的属性。

回答

如果只希望代码在首次加载时执行,则Application.Init可能是更适合使用的事件。

回答

@戴夫·沃德:这通常是可行的。但是,代码是将事件添加到行为对象上。由于行为对象的创建是在Application.Init期间发生的,因此添加到该事件将导致不可预测的行为。

如果有PostInit事件,那就太好了。

回答

我们可以执行的一种方法是在Application.Init中连接Application.Load处理程序,然后在运行后使该处理程序自行解除绑定:

Sys.Application.add_init(AppInit);

function AppInit() {
  Sys.Application.add_load(RunOnce);
}

function RunOnce() {
  // This will only happen once per GET request to the page.

  Sys.Application.remove_load(RunOnce);
}

那将在Application.Init之后执行。在pageLoad调用之前,这应该是最后一件事。

回答

@戴夫·沃德:
RunOnce方法的使用效果很好。这解决了我的问题,而没有变通办法来在添加到事件之前先检查处理程序是否已经存在。

我会将答案标记为可接受的答案。再次感谢。

回答

这是我们与aPost等效的isPostback,已经使用了一段时间。

public static bool isAjaxRequest(System.Web.HttpRequest request)
    {//Checks to see if the request is an Ajax request
        if (request.ServerVariables["HTTP_X_MICROSOFTAJAX"] != null ||
            request.Form["__CALLBACKID"] != null)
            return true;
        else
            return false;
    }