asp.net 如何避免“响应.重定向不能在页面回调中调用”

pw136qt2  于 2023-05-19  发布在  .NET
关注(0)|答案(5)|浏览(113)

我正在清理一些遗留的框架代码,其中大量代码只是通过异常进行编码。不检查值是否为null,因此会引发和捕获大量异常。
我已经清理了其中的大部分,然而,有一些错误/登录/安全相关的框架方法正在执行Response.Redirect,现在我们正在使用 AJAX ,我们得到了很多**“Response.Redirect cannot be called in a Page callback.”**如果可能的话,我想避免这种情况。
有没有一种方法可以通过编程避免这种异常?我在找类似于

if (Request.CanRedirect)
    Request.Redirect("url");

注意,这也发生在Server.Transfer中,所以我想检查一下我是否能够执行Request.Redirect或Server. Transfer。
目前,它只是这样做

try
{
    Server.Transfer("~/Error.aspx"); // sometimes response.redirect
}
catch (Exception abc)
{
    // handle error here, the error is typically:
    //    Response.Redirect cannot be called in a Page callback
}
cbeh67ev

cbeh67ev1#

你可以试试

if (!Page.IsCallback)
    Request.Redirect("url");

或者如果你手边没有网页...

try
{
    if (HttpContext.Current == null)
        return;
    if (HttpContext.Current.CurrentHandler == null)
        return;
    if (!(HttpContext.Current.CurrentHandler is System.Web.UI.Page))
        return;
    if (((System.Web.UI.Page)HttpContext.Current.CurrentHandler).IsCallback)
        return;

    Server.Transfer("~/Error.aspx");
}
catch (Exception abc)
{
    // handle it
}
b4qexyjb

b4qexyjb2#

我相信你可以简单地将Server.Transfer()替换为在回调过程中工作的Response.RedirectLocation()

try
{
    Response.RedirectLocation("~/Error.aspx"); // sometimes response.redirect
}
catch (Exception abc)
{
    // handle error here, the error is typically:
    //    Response.Redirect cannot be called in a Page callback
}
3b6akqbq

3b6akqbq3#

如上所述,但扩展为包括**.NET 4.x版本**,并在没有可用的Page时分配给Response.RedirectLocation属性。

try 
{
    HttpContext.Current.Response.Redirect("~/Error.aspx");
}
catch (ApplicationException) 
{
    HttpContext.Current.Response.RedirectLocation =    
                         System.Web.VirtualPathUtility.ToAbsolute("~/Error.aspx");
}
6qfn3psc

6qfn3psc4#

您应该加载ScriptManager或ScriptManagerProxy,然后检查IsInAsyncPostBack标志。它看起来像这样:

ScriptManager sm = this.Page.Form.FindControl("myScriptManager") as ScriptManager;
if(!sm.IsInAsyncPostBack)
{
    ...
}

通过这样做,您可以将异步回发(应该无法重定向)与普通回发(我假设您仍然希望重定向)混合使用。

eoxn13cs

eoxn13cs5#

如果在使用Dev express时出现错误,请添加此行,而不是response.redirect

DevExpress.Web.ASPxWebControl.RedirectOnCallback("~/Login.aspx");

相关问题