views:

2731

answers:

2

I'm cleaning up some legacy framework code and a huge amount of it is simply coding by exception. No values are checked to see if they are null, and as a result, copious amounts of exceptions are thrown and caught.

I've got most of them cleaned up, however, There are a few error / login / security related framework methods that are doing Response.Redirect and now that we are using ajax, we are getting ALOT of "Response.Redirect cannot be called in a Page callback." And I'd like to avoid this if at all possible.

Is there a way to programatically avoid this exception? I'm looking for something like

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

Note, this is also happening with Server.Transfer, so I'd like to be able to check if I am able to do Request.Redirect OR Server.Transfer.

Currently, its simply doing this

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  A: 

You can try

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

or if you dont have a Page handy...

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
}
Brandon
Where in HttpContext.Current can I find IsCallback? I wont always have a Page
Allen
Ah, found it, I added the code I ended up using to your answer, since your snippet is really all I needed. I can't believe I didn't think of something so simple myself, heh. Thanks man
Allen
+1  A: 

You should load up your ScriptManager or ScriptManagerProxy, and then check the IsInAsyncPostBack flag. That would look something like this:

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

By doing this, you can mix async postbacks (which should fail to redirect) with normal postbacks, which I'm assuming you still want to redirect.

Dan Monego
hrm, could you elaborate what the difference is between that and Page.IsCallback?
Allen
It looks like the difference is that IsCallback works for the Asp.net ICallbackEventHandler interface, while IsInAsyncPostBack works for UpdatePanel based changes.This is the most direct comparison between them I could find:http://timstall.dotnetdevelopersjournal.com/avoiding_unnecessary_server_work_in_aspnet.htm
Dan Monego
You can also use ScriptManager.GetCurrent(Page);
Karsten