2013-10-29 94 views
0

我在验证登录凭据后调用response.redirect 这一切在.net framework 3.5 中正常工作,但是当我升级到.net 4.5时 没有任何反应。它保持在同一页面上。Response.Redirect在.Net 4.5中不起作用

我已经试过各种排列

System.Web.HttpContext.Current.Response.Redirect("/"); 
System.Web.HttpContext.Current.Response.Redirect("/", false); 
System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest(); 

似乎没有任何工作 我已经把一个尝试捕捉周围和使用假时,我没有得到任何的异常。

该代码被调用了一个asp:button onClick事件。在点击事件过程中,我检查凭据是否正确,如果他们是我执行登录设置会话变量...并将其重定向到相应的登录页面以查看其角色。

更多信息 我把我的问题归结为基本情况。在以下情况中,两个按钮都会调用调用Response.redirect的相同函数btnTemp_Click。在asp:按钮的情况下,它在HTML5按钮的情况下不起作用。在这两种情况下,都会执行response.redirect上的断点。

<asp:Button ID="btnTemp" Text="Test Redirect" runat="server" OnClick="btnTemp_Click" /> 
<button id="btnTmp2" runat="server" onserverclick="btnTemp_Click" >button to Redirect</button> 

protected void btnTemp_Click(object sender, EventArgs e) 
{ 
     HttpContext.Current.Response.Redirect("http://www.google.com", false); 
} 

别的东西,点击按钮之后是怪异的ASP:按钮不再起作用

如果我创建了一个全新的Web应用程序,并没有任何在它不过这两个按钮它的工作原理对彼此而言。所以我必须有一些代码在onserverclick命中的地方做某事,但onclick不会。

+1

你能给这个代码的情况下更多的细节?它被用于Web窗体,MVC或其他东西吗?如果Web窗体,你在(Load,Pre Init,LoadComplete等)中使用了哪个事件?不知道更多,这将很难回答。 – Ryan

+3

'Response.Redirect'总是抛出一个异常。这就是为什么你认为你需要一个'try/catch'。它不会抛出'false'的原因是因为第二个参数决定线程是否中止。现在,当你说它不起作用时,那是可疑部分。 **你怎么知道*它不工作?** –

+0

尝试改变'Response.Redirect(“/”)''Response.Redirect(“〜/”)' – th1rdey3

回答

0

解决它采用詹姆斯 - 约翰逊的回答here

的问题基本上是如果你是一个更新面板内,控制没有具体登记为触发回传,那么你正试图重定向异步回发。

所以你必须明确地注册控件的回发触发

詹姆斯写道:

假设你使用一个UpdatePanel,下面 ScriptModule添加到您的web.config:

<httpModules> 
    <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
</httpModules> 

您的其他选项是注册控制做重定向作为回发控制。使用UpdatePanel,您可以通过添加PostBackTrigger来执行 。您还可以使用脚本管理器:

ScriptManager.GetCurrent(Page).RegisterPostBackControl(Button1); 

我无法得到的第一个解决方案的工作(至少在调试模式) 第二种解决方案在页面加载伟大的工作电话RegisterPostBackControl。

0

不知道这是否是问题的具体答案,但它可能会以迂回的方式解决问题,并且可以节省大量时间。

我在MS Ajax弹出窗口中遇到了NullReferenceException问题 - 具体地说,单击关闭弹出窗口应该返回到服务器,并且服务器端代码重定向到另一个页面,但它给出了此错误。

看着堆栈跟踪,我可以看到,除了本身在ScriptModule.HttpResponse_Redirecting方法被抛出。

谷歌什么都不会有帮助,看看DotPeek并没有真正告诉我这个问题。

然后我看到它在VS 2010中向上实际加载.NET Framework的代码符号是可能的,所以我这样做(工具 - >选项 - >启用.NET Framework的源步进)。

原来,原因是按钮点击被视为回调(而不是回发),Response.Reirect不喜欢这样(即他们不认为Response.Redirect应该被调用时Page.IsCallback为真),并在内部抛出异常。

虽然这被抓获(左右就出现),这是不是之前就失去了机会,在内部填充HttpResponse对象的RedirectLocation财产。

脚本模块代码,然后试图解析这个字符串,并且吹的事实,这是零。

这为我工作因此被明确地设置HttpResponse对象的RedirectLocation财产,立即在调用重定向解决方法。诚然,这不是一个特别优雅的解决方案,但是,让我们面对它,也不是MS阿贾克斯(也不是真正的WebForms为此事;!))

+0

感谢您的回复。我想我跟着你,但你有一些代码要显示吗?当您明确设置RedirectLocation时,将按钮单击为回发? – Leo

相关问题