我用updatepanel做了一些測試,並且據我所知,可以通過查看屬性Response.IsRequestBeingRedirected來確定是否正在通過updatepanel重定向響應。當看到來自updatepanels內部的重定向以及常規重定向時,此屬性似乎都能正確回答。問題在於,當響應被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();
}
}
不過,雖然上述正則表達式的作品在我的測試網址,我不能保證它能爲一切工作。
您是否考慮過一種靜態/擴展方法來轉換url,並在重定向時調用它?
//Extension method.
public static void TransformRedirect(this HttpResponse response,
string redirectUrl)
{
//Transform url here.
response.Redirect(redirectUrl);
}
//And when redirecting.
Response.TransformRedirect("RedirectTarget.aspx");
如果我沒有觸及我們試圖添加此功能的遺留應用程序,我願意去擴展路線。我們有很多地方需要將Response.Redirect呼叫更改爲新的分機。我喜歡正則表達式的想法,並將其整合到我的解決方案中。 –
如果您正在更新傳統應用程序,並且您需要一個適用於整個應用程序的解決方案,那麼可能我提到的響應過濾器值得考慮。它需要相當多的樣板,但它看起來非常健壯,而且你不會依賴於JavaScript實現的突發奇想。 – rusmus
過濾器唯一的問題是我必須修改我不想做的響應緩衝區的內容。一旦我將它添加到母版頁級別,Javascript工作得很好。 –