抛出异常时,AJAX方法调用是否完整?

时间:2009-10-12 14:44:32

标签: c# asp.net ajax exception

在菜单中单击菜单项时,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时出错了。

如果我注释掉抛出新的异常(“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);
    }
}

2 个答案:

答案 0 :(得分:0)

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

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

更新:

你的javascript太晚捕获了异常。 UpdatePanel管道已经将自己视为“错误”状态。任何由您的代码隐藏抛出但未在代码隐藏中捕获的异常将导致UpdatePanel删除它将呈现的所有HTML并返回一个简单的错误代码。然后你的javascript函数处理。

答案 1 :(得分:0)

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

  1. 重建页面的一部分 在面板内从头开始 通过正常的ASP.NET运行 页面生命周期(好吧,稍微 删节,但很接近)。
  2. 返回面板的HTML 给客户。
  3. 重建面板 客户端使用javascript DOM 操纵。
  4. 如果在第一步中有未处理的Exception,则AJAX调用失败,无法更新原始面板。这是一张图from the ASP.NET AJAX web site

    Partial-Page Rendering Overview

    考虑如果你在Exception中投掷未处理的Page_Load会发生什么。在这种情况下,ASP.NET无法完成HTML的构建,而且在这里也不能这样做。