拦截UpdatePanel帖子的重定向

时间:2014-01-07 05:57:16

标签: c# asp.net ajax redirect

根据以下链接,当您在更新面板内的任何帖子中执行'Response.Redirect'时,它将发送一个200的HTTPResponseCode,并且Ajax javascripty库将从那里接管以将用户重定向到页面。

https://connect.microsoft.com/VisualStudio/feedback/details/542238/redirecting-during-ajax-request-returns-wrong-status-code

但是,我正在编写一个模块,我在其中拦截所有重定向并更改URL以包含值。我在PreSendRequestContent事件中这样做。以下是我的代码

HttpApplication app = (HttpApplication)sender;

if (app.Response.StatusCode == 302 && !app.Response.RedirectLocation.Contains("MyValue"))
{
   // Add MyValue to URL
}

在上述重定向过程中,我有什么方法可以做同样的事情吗?我可以在客户端使用onEndRequest或类似事件以及服务器端的其他模块事件来做这个

2 个答案:

答案 0 :(得分:2)

我使用updatepanel进行了一些测试,据我所知,您可以通过查看属性Response.IsRequestBeingRedirected来确定更新面板是否重定向了响应。从更新面板内部看到重定向时,以及在进行常规重定向时,此属性似乎都能正确回答。问题是当updatepanel重定向响应时,Response.RedirectLocation为null,这意味着您必须修改响应的实际内容才能更改URL。

更改响应的内容非常棘手,因为响应输出流是只写的,这意味着您甚至无法获取内容更改它们然后覆盖响应。我找到的唯一方法是要求您按照Here所述将过滤器连接到响应。然而,这有点涉及,需要相当多的代码,并且必须在PreSendRequestContent之前连接过滤器(我不知道确切的时间,但之前......),这意味着你必须编写一个过滤器引用响应以确定是否转换内容。

因为上面描述的过滤器看起来有点过分,也许你可以通过使用正则表达式来清理你的javascript:

var redirectRegex = /pageRedirect\|{2,}(\S+)\|/;

function changeURL(sender, args) {
    var s = new String(sender._xmlHttpRequest.responseText);

    var match = redirectRegex.exec(s);
    if (match)
    {            
        encodedURL = decodeURIComponent(match[1]);
        window.location.href = DoCustomizationsOntheURL(encodedURL);
        args.stopPropagation();
    }
}

但是虽然上面的正则表达式适用于我的测试网址,但我不能保证它适用于所有内容。

您是否考虑使用静态/扩展方法来转换网址,并在重定向时调用它?

//Extension method.
public static void TransformRedirect(this HttpResponse response, 
                                     string redirectUrl)
{
    //Transform url here.
    response.Redirect(redirectUrl);
}

//And when redirecting.
Response.TransformRedirect("RedirectTarget.aspx");

答案 1 :(得分:0)

这是我找到的一个肮脏的解决方案。我在客户端添加了以下代码。

    Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginRequest);
    function beginRequest(sender, args) {
        args._request._events.addHandler('completed', changeURL);
    }
    function changeURL(sender, args) {
        var s = new String(sender._xmlHttpRequest.responseText);
        if (s.indexOf('pageRedirect') > -1)
        {
            var pattern = 'pageRedirect||';
            var s1 = s.substring(s.indexOf(pattern) + pattern.length, s.length);
            var nextPipe = s1.indexOf('|');
            var encodedURL = s1.substring(0, nextPipe);
            encodedURL = decodeURIComponent(encodedURL);
            window.location.href = DoCustomizationsOntheURL(encodedURL);
            args.stopPropagation();
        }
    }

但是,我对此解决方案并不满意并寻找更好的方法,请提出其他建议。