You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET中点击嵌套Span的服务器端按钮重定向时抛出异常问题

问题分析与解决方案

首先咱们拆解下问题:你的取消按钮嵌套<span>标签的写法完全没问题,和后续的跳转异常没有关联,核心问题出在Response.Redirect的使用逻辑上。

为什么加了try-catch就出问题?

ASP.NET里的Response.Redirect("StartPage.aspx")默认等价于Response.Redirect(url, true)——第二个参数endResponse设为true时,会触发Response.End()方法,而这个方法会主动抛出ThreadAbortException来终止当前请求的线程,这是ASP.NET的预期行为。

当你没加try-catch的时候,ASP.NET运行时会自动捕获这个异常并忽略它,所以跳转能正常完成;但一旦你加了try-catch,这个异常就被你的代码捕获了,于是执行了catch块里跳转到Error.aspx的逻辑,这就是你看到“抛出异常”的本质(其实是捕获了预期内的异常,触发了错误页面跳转)。

解决方案

根据你的需求,有两种处理方式:

方式1:移除多余的try-catch(推荐)

既然这个取消按钮只是用来退出表单跳转,而且不加try-catch时功能正常,那完全可以去掉try-catch块。因为ThreadAbortException是ASP.NET的正常流程,不需要额外捕获处理:

Response.Redirect("StartPage.aspx");

方式2:正确使用带endResponse=false的Redirect(如果必须保留try-catch)

如果你因为日志需求一定要保留try-catch,那要修改Response.Redirect的调用方式,避免抛出ThreadAbortException,同时确保请求正常结束:

try
{
    Response.Redirect("StartPage.aspx", false);
    // 告诉ASP.NET完成当前请求,不再执行后续页面生命周期代码
    Context.ApplicationInstance.CompleteRequest();
}
catch (Exception ex)
{
    NLog.LogManager.GetCurrentClassLogger().Warn("Error happened", ex);
    Response.Redirect("Error.aspx", false);
    Context.ApplicationInstance.CompleteRequest();
}

这样既不会触发预期外的异常捕获,也能保证跳转逻辑正常执行,同时保留你的日志记录需求。

内容的提问来源于stack exchange,提问作者narutouzumaki 99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 19:42:26