Как избежать "Response.Redirect не может быть вызван в обратном вызове страницы" - PullRequest
12 голосов
/ 08 октября 2009

Я очищаю некоторый устаревший код фреймворка, и огромное его количество просто кодирует за исключением. Никакие значения не проверяются, чтобы видеть, являются ли они нулевыми, и в результате большое количество исключений выбрасывается и перехватывается.

У меня большинство из них очищено, однако, есть несколько методов, связанных с ошибками / логином / безопасностью, которые делают Response.Redirect, и теперь, когда мы используем ajax, мы получаем ALOT " Response.Redirect не может быть вызван в обратном вызове страницы. " И я бы хотел избежать этого, если это вообще возможно.

Есть ли способ программно избежать этого исключения? Я ищу что-то вроде

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
}

Ответы [ 4 ]

14 голосов
/ 08 октября 2009

Вы можете попробовать

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
}
6 голосов
/ 23 июня 2011

Полагаю, вы можете просто заменить 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
}
1 голос
/ 16 декабря 2015

Как упоминалось выше, но расширен для включения .NET 4.x версии и присвоения свойству Response.RedirectLocation, когда Page недоступно.

try 
{
    HttpContext.Current.Response.Redirect("~/Error.aspx");
}
catch (ApplicationException) 
{
    HttpContext.Current.Response.RedirectLocation =    
                         System.Web.VirtualPathUtility.ToAbsolute("~/Error.aspx");
}
1 голос
/ 08 октября 2009

Вы должны загрузить свой ScriptManager или ScriptManagerProxy, а затем проверить флаг IsInAsyncPostBack. Это будет выглядеть примерно так:

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

Делая это, вы можете смешивать асинхронные обратные вызовы (которые не должны перенаправлять) с обычными обратными вызовами, которые, как я предполагаю, вы все еще хотите перенаправить.

...