Как избежать "Response.Redirect не может быть вызван в обратном вызове страницы"
Я очищаю некоторый код устаревшего фреймворка, и огромное количество его просто кодируется по исключению. Значения не проверяются, чтобы увидеть, являются ли они нулевыми, и, как следствие, большое количество исключений бросается и ломается.
У меня большинство из них очищено, однако Есть несколько методов фреймворка error/login/security, которые делают 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
}
Ответы
Ответ 1
Вы можете попробовать
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
}
Ответ 2
Я считаю, что вы можете просто заменить 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
}
Ответ 3
Вы должны загрузить свой ScriptManager или ScriptManagerProxy, а затем проверить флаг IsInAsyncPostBack. Это будет выглядеть примерно так:
ScriptManager sm = this.Page.Form.FindControl("myScriptManager") as ScriptManager;
if(!sm.IsInAsyncPostBack)
{
...
}
Таким образом, вы можете смешивать async-обратные вызовы (которые не должны перенаправляться) с нормальными обратными передачами, которые я предполагаю, что вы все еще хотите перенаправить.
Ответ 4
Как упоминалось выше, но расширенный, чтобы включить .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");
}