25

我在更新面板下的页面中编写了以下代码。

protected void myGrid_RowCommand(object sender, GridViewCommandEventArgs e)
{
    try
    {
        if (e.CommandName =="EditNames")
        {
            long lSelectedName = Convert.ToInt64(e.CommandArgument);
            Session["SelectedItem"] = lSelectedName;
            Response.Redirect("EditItem.aspx");
        }
        else if (e.CommandName =="DeleteNames")
        {
            long lSelectedName = Convert.ToInt64(e.CommandArgument);
            ValidName.DeleteItem(lSelectedName);

            ScriptManager.RegisterStartupScript(this, GetType(), "Key", "alert('Name deleted sucessfully')", true);
        }
    }
    catch (System.Threading.ThreadAbortException)
    {

    }
    catch (Exception ex)
    {
        Error handling code...
    }
}

在这里,我在重定向时遇到线程中止异常。但是,我通过使用错误处理程序解决了它System.Threading.ThreadAbortException

但我不确定为什么重定向时会出现该错误。即使我解决了这个问题,我也想知道我的编码方式是否有任何错误,或者有什么方法可以完全阻止错误触发。

给你的意见...

请注意,该页面位于 AJAX UPDATE PANEL 下。

4

5 回答 5

36

请阅读这篇文章 - http://blogs.msdn.com/b/tmarq/archive/2009/06/25/correct-use-of-system-web-httpresponse-redirect.aspx

与其结束请求,不如通过调用Context.ApplicationInstance.CompleteRequest().

所以你的代码看起来像这样:

Response.Redirect("TargetPage", false);        //write redirect
Context.ApplicationInstance.CompleteRequest(); // end response
于 2014-07-22T06:41:45.613 回答
25

即使,我解决了这个问题,我想知道我编码的方式是否有任何错误

没有错,你做得很好。

预计会出现此错误。它被抛出是因为服务器线程实际上在重定向时被中止。从MSDN 文档

如果为 endResponse 参数指定 true,则此方法会为原始请求调用 End 方法,该方法在完成时会引发 ThreadAbortException 异常。

以及您正在使用的重载文档:

重定向调用 End 在完成时抛出 ThreadAbortException 异常。

于 2013-08-27T12:24:58.107 回答
2

发生这种情况是因为您在 try/catch 块内进行重定向。不要这样做。

于 2016-06-25T09:30:51.690 回答
0

在重定向方法中提及 false 就足够了,例如 Response.Redirect("TargetPage", false);

于 2014-08-02T06:42:42.630 回答
0
Response.Redirect("Location", false);

没有“ThreadAbortException”,它可以正常工作。

于 2022-02-09T09:45:35.557 回答