2013-04-10 42 views
0

如果有人使用ref的查詢字符串鍵(例如mysite.com/AboutUs?ref=Test)訪問我們的網站,是否可以在所有將來的鏈接/表單帖子上保留該查詢字符串?如何維護所有請求中的特定查詢字符串?

因此,例如,我可能會在我們的網站上有鏈接轉到mysite.com/Products。我希望將其轉換爲mysite.com/Products?ref=Test。

理想情況下,我想知道這是否可以通過檢查前一個URL並將其添加到當前的URL中,當對頁面發出請求時,可能通過攔截路由並追加密鑰(如果它不'已經存在)。

該項目是一個MVC 4應用程序。

回答

3

你可以通過將它添加到每一個URL來傳遞它,但這需要手動添加到每個使用Html.ActionLink等(或者我想你可以創建一個自定義的HTML幫助程序來爲你做,但那麼每個在你的項目中工作的開發人員都需要記住總是使用自定義幫助程序)以及控制器操作中的所有重定向等。總而言之,這將非常耗時且非常脆弱。

最好的辦法是簡單地用querystring參數截獲初始請求,然後設置會話變量。然後,您可以簡單地檢查會話變量的存在,而不是查詢字符串參數。

要處理所有這些邏輯,最好的辦法是創建一個全局動作過濾器。有相當廣泛的documentation on Filters at MSDN。一旦你創建了你的過濾器,你只需要在FilterConfig.cs中(在App_Start中)註冊它就可以全局化。

+0

謝謝。就像一個單獨的問題一樣,爲什麼你會推薦一個全局動作過濾器,而不是對控制器應用過濾器?我只問,因爲對我來說,這似乎每頁執行多次(我假設是因爲PartialRender的)。 –

+0

我推薦了一個全局過濾器,因爲你說過「*所有*未來的請求」。如果你不全球化,那麼你必須記得永遠和永遠地將過濾器手動添加到每個控制器,墨菲說你*會忘記這麼做。過濾器可能在一個視圖中多次運行的原因很可能是由於子操作,而MVC(相當愚蠢)視爲完全成熟的操作(包括路由和全部),即使實際上並非如此。不過,像這樣的簡單過濾器不應該造成任何問題,無論它運行多少次。如果它更復雜,你可能會遇到問題。 –

1

在Cookie中設置URL參數,然後在您的代碼中根據Cookie或URL中該值的存在性做任何您想要執行的操作。

if(parameter set in cookie OR URL) 
    // do stuff 
if(parameter set in URL) 
    // set the cookie so that future actions are also tagged with that parameter 

或者,如果您希望只爲會話發生此類標記,請設置會話變量。

以您建議的方式來完成 - 您可以基於此標記重寫您網頁上的所有鏈接,但這將是一個迂迴並且昂貴的方式。大多數語言允許一個鉤子,它允許你的代碼在發送給瀏覽器之前處理HTML輸出;只需運行適當的正則表達式搜索並替換即可獲得您想要的內容。例如PHP具有ob緩衝和相關功能。你可以使用.Net的等價物。

+0

在這個線程中的其他答案建議會話狀態,這對我有用,但我擔心,如果會話死亡,我將無法訪問「參考」。我有點喜歡餅乾的想法,但我無法弄清楚調用它的正確時間。我似乎無法在正確的時間讀取cookie值。 –

+0

忘記最後一條評論,我不正確地使用Request而不是Response。 –

相關問題