我收到错误:
无法评估表达式,因为代码已优化或本机框位于调用堆栈之上。
我已重定向到repeater的itemcommand事件中的新页面。错误发生在以下行:
string url = "~/Galleries/AlbumImageList.aspx?UId=" + this.UserId.ToString() + "&AlbumId=" + e.CommandArgument.ToString();
Response.Redirect(url);
有人可以帮帮我吗?那有什么不对吗?
_COMPlusExceptionCode
是 - 532459699
。
答案 0 :(得分:159)
Request.Redirect(url,false);
false
表示当前页面的执行是否应该终止。
答案 1 :(得分:120)
制作Response
false 的第二个参数,如下所示。
Response.Redirect(url,false);
答案 2 :(得分:66)
要解决此问题,请使用以下方法之一:
对于Response.End,请致电HttpContext.Current.ApplicationInstance.CompleteRequest() 方法而不是 Response.End 绕过代码执行到 Application_EndRequest 事件。
对于Response.Redirect,请使用 endResponse的 Response.Redirect(String url,bool endResponse) false 参数,用于禁止内部调用 Response.End 。例如:
Response.Redirect ("nextpage.aspx", false);
如果您使用此解决方法,则代码 在执行Response.Redirect之后。对于Server.Transfer,请改用Server.Execute方法。
如果使用Response.End,Response.Redirect或Server.Transfer 方法,发生ThreadAbortException异常。你可以使用 try-catch语句来捕获此异常。
Response.End方法结束页面执行并转移 执行到应用程序中的Application_EndRequest事件 事件管道。 Response.End之后的代码行不是 执行。
Response.Redirect和Server.Transfer中出现此问题 方法因为两个方法都在内部调用Response.End。
此行为是设计使然。
文章编号:312629 - 最后修改:2012年8月30日 - 修订:4.0
适用于
- Microsoft ASP.NET 4.5
- Microsoft ASP.NET 4
- Microsoft ASP.NET 3.5
- Microsoft ASP.NET 2.0
- Microsoft ASP.NET 1.1
- Microsoft ASP.NET 1.0
关键字: kbexcepthandling kbprb KB312629
来源: PRB: ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer
答案 3 :(得分:14)
在我正在调查的一个错误中,有一个Response.Redirect(),它正在意外位置执行(读取:不适当的位置 - 在成员属性getter方法)。
如果您正在调试问题并遇到“无法评估表达式... ”例外:
Response.Redirect()
并将第二个参数 endResponse = false 或这令人沮丧,因为它似乎在调试器的“逐步执行”到达该位置之前执行重定向调用。
答案 4 :(得分:13)
请检查此链接,了解此问题背后的原因以及错误解决方案:
http://support.microsoft.com/kb/312629/EN-US/
Microsoft支持文章:
PRB:如果您使用Response.End,Response.Redirect或Server.Transfer打印打印电子邮件,则会发生ThreadAbortException
要解决此问题,请使用以下方法之一:For Response.End,打电话给 改为使用HttpContext.Current.ApplicationInstance.CompleteRequest方法 Response.End绕过代码执行到 Application_EndRequest事件。
对于Response.Redirect,请使用重载, Response.Redirect(String url,bool endResponse) 传递虚假的 endResponse参数用于抑制内部调用 到Response.End。
例如:Response.Redirect(“nextpage.aspx”, 假);
如果使用此解决方法,则会执行Response.Redirect之后的代码。对于Server.Transfer,请使用 而不是Server.Execute方法。
答案 5 :(得分:3)
我也有同样的问题,这很棘手。对我来说,这是因为我使用的是Ext.Js javascript库。如果您在Ajax调用中访问的服务器端代码中执行response.redirect,则存在问题。 Ext.js有一个Ext.Redirect方法的解决方法。
答案 6 :(得分:3)
您也可以使用Server.Execute
答案 7 :(得分:3)
使用此代码解决问题:
string path = AppDomain.CurrentDomain.BaseDirectory.ToString() + "Uploadfile\\" + fileName;
System.IO.FileStream fs = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] bt = new byte[fs.Length];
fs.Read(bt, 0, (int)fs.Length);
fs.Close();
Response.ContentType = "application/x-unknown/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName;+ "\"");
try
{
if (bt != null)
{
System.IO.MemoryStream stream1 = new System.IO.MemoryStream(bt, true);
stream1.Write(bt, 0, bt.Length);
Response.BinaryWrite(bt);
//Response.OutputStream.Write(bt, 0, (int)stream1.Length);
Response.Flush();
// Response.End();
}
}
catch (Exception ex)
{
Response.Write(ex.Message);
throw ex;
}
finally
{
Response.End();
}
答案 8 :(得分:2)
只是包住其他人遇到我所做的问题我正在使用Response.End()一个异步触发按钮
<asp:AsyncPostBackTrigger ControlID="btn_login" />
在更新面板中。我切换到常规帖子不是最好的,但它的工作。
<asp:PostBackTrigger ControlID="btn_login" />.
由于我只是在页面上重定向,这是一个可行的解决方案。
答案 9 :(得分:2)
如果您使用更新面板和链接按钮下载excel在面板内部而不是添加回发触发器
val
并在内部点击事件后面的代码中
<asp:PostBackTrigger ControlID="lnkTemplate" />
答案 10 :(得分:0)
使用它,总是对我有用。
Response.Redirect(Request.RawUrl, false);
在这里,Response.Redirect(Request.RawUrl)仅重定向到当前上下文的url,而第二个参数“ false”则指示是否要endResponse。
答案 11 :(得分:0)
当您在mvc中具有带有某些验证规则的模型的剃须刀页面时,可能会导致此问题。当您从表单发布而忘记在某些字段上显示验证错误时,此消息可能会出现。推测:可能是您要发布到的方法与其他来源使用的方法不同,或与原始请求所使用的方法位于不同的地方。
因此,由于执行方式和模型状态不同(类似情况),因此由于不同而无法返回到原始页面以显示或处理错误。
可能很难发现,但容易犯错。确保您的接收方法确实验证了所有可能的发布方式。
例如,即使您进行的服务器端验证实际上无法以大于验证所允许的最大值的形式编写字符串,也可能会有其他方式和来源发布到接收方法。 / p>