Response.Redirect在.Net 4.5中不起作用

时间:2013-10-29 17:39:05

标签: c# asp.net

我在验证登录凭据后调用response.redirect 这一切在.net framework 3.5中运行良好 但是当我升级到.net 4.5时 什么都没发生。它保持在同一页面上。

我尝试了各种排列

System.Web.HttpContext.Current.Response.Redirect("/");
System.Web.HttpContext.Current.Response.Redirect("/", false);
System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();
似乎什么都没有用 我已经尝试了一下它并且在使用false时没有任何异常。

代码正在调用asp:按钮onClick事件。在点击事件期间,我检查凭据是否正确,如果它们是我执行登录设置会话变量...并将它们重定向到他们角色的相应登录页面。

更多信息 我已将问题归结为基本情景。在以下场景中,两个按钮都调用相同的函数btnTemp_Click,该函数调用Response.redirect。在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没有。

2 个答案:

答案 0 :(得分:0)

使用James Johnson的回答here

解决了这个问题

问题基本上是如果你在更新面板内并且控件没有专门注册为回发触发器,那么你试图重定向异步回发。

因此您必须将控件显式注册为回发触发器

  詹姆斯写道:

     

假设您正在使用UpdatePanel,请添加以下内容   脚本模块到你的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。

答案 1 :(得分:0)

不知道这是否是您问题的具体答案,但它可能会以迂回的方式解决问题,并且可以节省很多时间。[/ p>

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

查看堆栈跟踪,我可以看到异常本身是在ScriptModule.HttpResponse_Redirecting方法中抛出的。

google上没有任何内容可以提供帮助,并且查看DotPeek并没有真正告诉我这个问题。

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

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

虽然这个被捕获(或者它出现了),但是在它失去了在内部填充HttpResponse对象的RedirectLocation属性的机会之前。

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

因此,对我有用的解决方法是在调用Redirect之前立即显式设置HttpResponse对象的RedirectLocation属性。不可否认,这不是一个特别优雅的解决方案,但是,让我们面对它,MS Ajax也不是(WebForms也不是真的那么重要!))