根据以下链接,当您在更新面板内的任何帖子中执行'Response.Redirect'时,它将发送一个200的HTTPResponseCode,并且Ajax javascripty库将从那里接管以将用户重定向到页面。
但是,我正在编写一个模块,我在其中拦截所有重定向并更改URL以包含值。我在PreSendRequestContent事件中这样做。以下是我的代码
HttpApplication app = (HttpApplication)sender;
if (app.Response.StatusCode == 302 && !app.Response.RedirectLocation.Contains("MyValue"))
{
// Add MyValue to URL
}
在上述重定向过程中,我有什么方法可以做同样的事情吗?我可以在客户端使用onEndRequest或类似事件以及服务器端的其他模块事件来做这个
答案 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();
}
}
但是,我对此解决方案并不满意并寻找更好的方法,请提出其他建议。