11

Я очищаю некоторый код устаревшего кода, и огромное количество его просто кодируется по исключению. Значения не проверяются, чтобы увидеть, являются ли они нулевыми, и, как следствие, большое количество исключений бросается и ломается.Как избежать «Response.Redirect не может быть вызван в обратном обращении к странице»

У меня есть большинство из них очищено, однако Есть несколько методов фреймворка error/login/security, которые делают Response.Redirect, и теперь, когда мы используем ajax, мы получаем ALOT «Ответ .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 
} 

ответ

13

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

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 
} 
+0

Где в HttpContext.Current можно найти IsCallback? У меня не всегда будет Страница –

+0

Ах, я нашел ее, я добавил код, который я использовал для вашего ответа, так как ваш фрагмент действительно все, что мне нужно. Я не могу поверить, что не думал о том, что так просто, хе-хе. Спасибо человеку –

1

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

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

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

+0

hrm, не могли бы вы уточнить, какая разница между этим и страницей.IsCallback? –

+0

Похоже, что IsCallback работает для интерфейса Asp.net ICallbackEventHandler, а IsInAsyncPostBack работает для изменений на основе UpdatePanel. Это самое прямое сравнение между ними я мог бы найти: http://timstall.dotnetdevelopersjournal.com/avoiding_unnecessary_server_work_in_aspnet.htm –

+1

Вы можете также использовать ScriptManager.GetCurrent (страница); – Karsten

6

Я считаю, что вы можете просто заменить 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

Для записи я нахожу (ASP.NET 4.x), что a) 'Response.RedirectLocation' - свойство, а не метод, и b) оно не расшифровывает' ~ 'нотацию, поэтому вам нужно' Response.RedirectLocation = Page.ResolveUrl ("~/Error.aspx") '. – JonBrave

1

Как уже упоминалось выше, но расширена за счет включения .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"); 
}