【问题标题】:Will AJAX methods calls complete when an exception is thrown?抛出异常时,AJAX 方法调用是否会完成?
【发布时间】:2010-12-06 00:20:21
【问题描述】:

当在我的菜单中单击一个菜单项时,一个 ASCX 控件会通过我的 asp 面板中的 AJAX 加载。为此,我有一个方法:

public void LoadControl(ControlDestination controlDestination, string filename)
{
    try
    {
        // Load control from file
        Control control = LoadControl(filename);

        // Check control extends BaseForm
          // Do stuff    
        }
        else
        {
            throw new Exception("Web User Control erft niet van BaseForm.");
        }
    }
    catch (ArgumentNullException e)
    {
        // Implement
    }
    catch(HttpException e)
    {
        LoadControl(ControlDestination.Menu, "Error.ascx");
        throw new Exception("User control niet gevonden: " + e.ToString());
    }
}

当我在 HttpException 处设置断点时,我到达了那里。我按 F11 并执行 LoadControl 中的代码。然后弹出异常。这一切都很顺利,但永远不会加载 Error.ascx。我知道该方法有效,因为当我想通过此方法加载其他 ASCX 对象时,它有效。但是当我想加载 Error.ascx 时出错了。

如果我注释掉 throw new Exception("User control niet gevonden" + e.ToString()); 我可以看到 Error.ascx我希望这两行都被执行。

编辑:

在我的母版页中,我有这段 javascript 代码来捕获一些异常:

function pageLoad() {
    var manager = Sys.WebForms.PageRequestManager.getInstance();
    manager.add_endRequest(endRequest);
    manager.add_beginRequest(beginRequest);
}

function endRequest(sender, args){
    var Error = args.get_error();
    if (Error != null) {
        ToggleErrorOn(true);
        document.getElementById("ErrorContent").innerHTML = Error.message;
        args.set_errorHandled(true);
    }
}

【问题讨论】:

  • 嗯,如果您在加载控件后抛出异常,您的整个页面将被“执行”,除非您在调用“LoadControl”方法时捕获了该异常。
  • 什么意思,我的整个页面都会被执行?

标签: c# asp.net ajax exception


【解决方案1】:

当您在UpdatePanel ASP.NET 中触发服务器端方法时,会执行以下操作:

  1. 重建页面的一部分 在面板内从头开始 通过正常的 ASP.NET 运行 页面生命周期(嗯,稍微 有删节,但很接近)。
  2. 发回面板的 HTML 给客户。
  3. 重建面板 使用 javascript DOM 的客户端 操纵。

如果在第一步中有一个未处理的Exception,AJAX 调用将失败并且它无法更新原始面板。这是一张图表from the ASP.NET AJAX web site

考虑一下如果你在Page_Load 中抛出一个未处理的Exception 会发生什么。在这种情况下,ASP.NET 将无法完成您的 HTML 的构建,并且在这里也无法完成。

【讨论】:

  • 但是当我在调试器中并在异常中设置断点时,代码会被执行。这是为什么呢?
  • 在我的startpost中我添加了一些处理异常的javascript代码
  • 加载错误控件后抛出异常是为了达到什么目的?
  • 感谢您的解释。当发生异常时,我想要两件事:1.调用一个方法(这将处理一些 UI 事情)和 2.将错误传递给客户端。我在覆盖的 div 中显示错误。我也希望将错误写入数据库。
  • 知道了!您可以在调用 LoadControl 后在 HttpException 处理程序中完成这两件事,而不是抛出异常。
【解决方案2】:

未捕获的异常会导致更新面板无法进行任何渲染。相反,它将错误代码传递回显示错误消息的 AJAX 处理程序。

因此,如果您继续抛出该异常,您的 Error.ascx 将永远不会被渲染。

更新:

您的 javascript 捕获异常为时已晚。 UpdatePanel 管道已经认为自己处于“错误”状态。任何由您的代码隐藏引发但未在在您的代码隐藏中捕获的异常都将导致 UpdatePanel 删除它会呈现的所有 HTML 并返回一个简单的错误代码。然后您的 javascript 函数正在处理哪个。

【讨论】:

  • 我添加了 catch(Exception e){LoadControl(ControlDestination.Menu, "Error.ascx"); throw new Exception("用户控制 niet gevonden:" + e.ToString());但我仍然得到同样的错误,我的 error.ascx 没有加载
  • you 抛出的异常未被捕获,它终止了 AJAX 操作。
  • 在我的startpost中我添加了一些处理异常的javascript代码
  • Javascript 无法“处理”代码隐藏引发的错误。您必须在代码隐藏中捕获它,否则 UpdatePanel 将自行中止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 2019-04-26
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多