我正在清理一些遗留框架代码,其中大量代码只是异常编码。不检查任何值以查看它们是否为空,因此会抛出并捕获大量异常。
我已经清理了大部分内容,但是,有一些错误/登录/安全相关的框架方法正在做Response.Redirect,现在我们正在使用ajax,我们得到了很多“无法在Page回调中调用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
}
答案 0 :(得分:14)
你可以尝试
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
}
答案 1 :(得分: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
}
答案 2 :(得分:1)
您应该加载ScriptManager或ScriptManagerProxy,然后检查IsInAsyncPostBack标志。这看起来像这样:
ScriptManager sm = this.Page.Form.FindControl("myScriptManager") as ScriptManager;
if(!sm.IsInAsyncPostBack)
{
...
}
通过执行此操作,您可以将异步回发(应该无法重定向)与正常回发混合使用,我假设您仍然希望重定向。
答案 3 :(得分: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");
}