2014-01-07 115 views
8

根據下面的鏈接,當您在更新面板內的任何帖子期間執行'Response.Redirect'時,它將發送200的HTTPResponseCode,並且Ajax javascripty庫將從那裏接管以將用戶重定向到頁。UpdatePanel攔截重定向

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或類似事件和服務器端的一些其他模塊事件來做到這一點

回答

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(); 
     } 
    } 

但是,我不滿意這個解決方案,並尋找更好的方法,請建議一些其他方式。

2

我用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"); 
+0

如果我沒有觸及我們試圖添加此功能的遺留應用程序,我願意去擴展路線。我們有很多地方需要將Response.Redirect呼叫更改爲新的分機。我喜歡正則表達式的想法,並將其整合到我的解決方案中。 –

+0

如果您正在更新傳統應用程序,並且您需要一個適用於整個應用程序的解決方案,那麼可能我提到的響應過濾器值得考慮。它需要相當多的樣板,但它看起來非常健壯,而且你不會依賴於JavaScript實現的突發奇想。 – rusmus

+0

過濾器唯一的問題是我必須修改我不想做的響應緩衝區的內容。一旦我將它添加到母版頁級別,Javascript工作得很好。 –

相關問題