65.9K
CodeProject 正在变化。 阅读更多。
Home

Ajax 页面生命周期事件处理程序参数

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.50/5 (2投票s)

2008年5月23日

CPOL

5分钟阅读

viewsIcon

58379

解释了部分页面渲染的客户端事件处理程序参数 - PageRequestManager

引言

本文是上一篇文章 [Ajax 客户端页面生命周期] 的续篇。本文解释了事件参数及其在异步部分页面加载期间的用法。

页面生命周期事件处理程序参数

事件参数本身就是与其事件处理程序相对应的对象的实例。每个参数都提供了对其他对象、方法和属性的引用,使我们能够更详细地处理这些事件。

Sys.WebForms.InitializeRequestEventArgs 类

此类对象用作 PageRequestManager 类的 intializeRequest 事件的参数。此处列出了此对象的 方法,其中 args intializeRequestEventArgs 类的实例。为了更好地理解,每个属性下方都附带了代码片段。

  • args.get_postBackElement();
  • args.get_request();
//add handler to pageInit event
Sys.Application.add_init(MyInit);

function MyInit()
{
    //alert("MyInit added to page request");
    //add handler to intializeRequest event
    Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest
						(MyIntializeRequest);
    //Sys.WebForms.PageRequestManager.getInstance().remove_initializeRequest
    //(MyIntializeRequest);
}

//sender gives reference to PageRequestManager object
//args gives reference to initializeRequestEventArgs object
function MyIntializeRequest(sender,args)
{
    //assign the reference of element which initiated the postback to a variable
    var ele = args.get_postBackElement();

    //change the property of the postback element
    args.get_postBackElement().disabled = true;

    //sets the display value of postback element
    args.get_postBackElement().value = "Page is getting Loaded...";

    //cancel the postback initiated
    sender.abortPostBack();
}

Sys.WebForms.BeginRequestEventArgs 类

此类对象由 BeginRequest 事件使用。此对象与前一个对象非常相似。该对象将在请求发送到服务器之前实例化。属性和代码片段如下所示。

  • args.get_postBackElement();
  • args.get_request();
//add this code inside pageInit or pageLoad event
Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(MyPageLoading);
//Sys.WebForms.PageRequestManager.getInstance().remove_pageLoading(MyPageLoading);

//sender gives reference to PageRequestManager object
//args gives reference to BeginRequestEventArgs object
function MyBeginRequest(sender,args)
{
    //we can do all the actions that we did
    //for intializeRequest event.
}

Sys.WebForms.PageLoadingEventArgs 类

此对象由 pageLoading 事件使用。它提供了对异步回发中使用的两个更新面板集合的引用。

  1. 回发期间删除的面板,以及
  2. 即将更新的面板

我们可以在此处获取尚未更新的更新面板的内容。这些面板将在 pageLoaded 事件之后更新。更新面板的内容可以在此处更改,但它不会在生命周期结束时反映在页面上,因为 pageLoaded 事件会将新内容放置在页面上。这最终将对用户可见。

  • args.get_panelsUpdating();
  • args.get_panelsDeleting();
  • args.get_dataItems();
//this line of code should be inside pageInit or pageLoad event
Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(MyPageLoading);
//Sys.WebForms.PageRequestManager.getInstance().remove_pageLoading(MyPageLoading);

//sender gives reference to PageRequestManager object
//args gives reference to PageLoadingEventArgs object
function MyPageLoading(sender,args)
{
    //the panel collection (going to be updated) count will be displayed.
    alert(args.get_panelsUpdating().length);

    //the content of the first item from panel collections will be assigned to a variable
    var content = args.get_panelsUpdating()[0].innerText;

    //display number of panels is getting deleted during this post back
    alert(args.get_panelsDeleting().length)
}

Sys.WebForms.PageLoadedEventArgs 类

pageLoaded 事件为此对象提供引用。pageLoading pageLoaded 非常相似。这两个事件都将在服务器页面 Render 事件之后触发,但 pageLoading 事件将在内容更新之前触发,而 pageLoaded 事件将在内容更新之后触发。方法如下所示。

  • args.get_panelsUpdated();
  • args.get_panelsCreated();
  • args.get_dataItems();
//this line of code should be inside pageInit or pageLoad event
Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(MyPageLoaded);
//Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(MyPageLoaded);

//sender gives reference to PageRequestManager object
//args gives reference to PageLoadedEventArgs object
function MyPageLoaded(sender,args)
{
    //the updated panels collection count will be displayed.
    alert(args.get_panelsUpdated().length);

    //the content of the first item from updated panel collections
    //will be assigned to a variable
    var content = args.get_panelsUpdated()[0].innerText;

    //display number of panels created during this postback
    alert(args.get_panelsCreated().length)
}

Sys.WebForms.EndRequestEventArgs 类

EndRequest 事件的对象,这是异步部分回发的最后一个事件。此事件将在回发完成后引发。响应是此对象的一个成员。此对象的特殊之处在于它允许我们处理错误。如果回发期间发生任何错误,错误对象也将是此对象的一个成员,否则为 null 。我们还可以处理错误并为发生错误时显示的错误对象设置自己的自定义值。由于我们提供了处理错误的功能,因此也可以抑制错误,使其不会显示给用户。这通过 errorHandled 属性来完成。如果设置为 true ,则会抑制错误。方法如下所示。

  • args.get_dataItems();
  • args.get_error();
  • args.get_errorHandled();
  • args.get_response();
//this line of code should be inside pageInit or pageLoad event
Sys.WebForms.PageRequestManager.getInstance().add_endRequest(MyEndRequest);
//Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(MyEndRequest);

//sender gives reference to PageRequestManager object
//args gives reference to EndRequestEventArgs object
function MyEndRequest(sender, args)
{
    //alert("My Request has end");
    if (args.get_error() != null)
    {
        args.set_errorHandled(true);
    }
}

Sys.WebForms 异常

此处讨论异步部分回发期间发生的异常。异常由 Ajax 动态创建。异常如下所示。

  • PageRequestManagerParserErrorException
  • PageRequestManagerServerErrorException
  • PageRequestManagerTimeoutErrorException

当处理响应时发生错误时,会发生 ParserErrorException 。一种情况是,在部分回发中使用 Server.Transfer 。在这种情况下,请求被发送到服务器,服务器将请求转移到另一个页面,而客户端对此并不知情。因此,客户端预期的页面响应失败,从而引发错误。同样的情况可以通过 Response.Redirect 来避免,因为它会进行两次与服务器的往返,而且客户端也知道页面重定向。

ServerErrorException 发生于服务器端代码的所有未处理错误。例如,尝试将 null 解析为 int ,向未实例化的对象分配值,或类似的错误会引发此异常。

TimeoutException 顾名思义。当响应未在指定的时间范围内返回时,将抛出此异常。ScriptManager 控件负责处理这些情况。我们可以通过增加 ScriptManager AsyncPostBackTimeout 属性的值来避免这种情况。

这些错误可以在 endRequest 事件中捕获。get_error() 方法可用于检索错误对象,错误对象的 name 属性给出错误的完整名称,我们可以相应地进行处理。下面 endRequest 事件的代码片段对此进行了说明。

function MyEndRequest(sender, args)
{
    //alert("My Request has end");
    var s = sender;
    var a = args;
    var msg = null;
    if (a._error != null)
    {
        switch (args._error.name)
        {
            case "Sys.WebForms.PageRequestManagerServerErrorException" :
                msg = "PageRequestManagerServerErrorException";
                break;
            case "Sys.WebForms.PageRequestManagerParserErrorException" :
                msg = "PageRequestManagerParserErrorException";
                break;
            case "Sys.WebForms.PageRequestManagerTimeoutException" :
                msg = "PageRequestManagerTimeoutException";
                break;
        }
        args._error.message = "My Custom Error Message " + msg;
        args.set_errorHandled(true);
    }
 }

附加信息

处理程序可以像添加它们一样被移除。添加自定义事件处理程序的注释行下方是移除已添加自定义事件处理程序的代码。此说明适用于整个文章。我只是为了演示目的而这样写的。

Ajax 的对象没有属性,它们实际上是方法。为了方便记忆,请在成员的实际名称前加上 get_ 和 set_ 前缀。此外,还有许多成员直接暴露给用户,它们不受限制。由于 JavaScript 在面向对象方面没有提供那么多灵活性,尽管它在很大程度上支持它。这些成员类似于属性名称,前面只有一个下划线 (_)。我们仍然可以选择使用它们,通常不建议这样做,但如果我们能够理解并进行更改,它就能正常工作。正如您所看到的,在上面的代码片段中,_error.message 被设置为自定义值。

关于 Ajax 还有很多需要讨论的。让我们在未来的文章中探讨它们。

历史

  • 2008 年 5 月 23 日:首次发布
© . All rights reserved.