2011-09-27 76 views
1

對這個問題很新穎,並在槍下拿出一個解決方案。問題是我如何加載同一個ASPX頁面的幾個版本之一,對於任何給定的頁面。例如。未知的請求catalog.aspx的毫無戒心的用戶,我實際上服務catalog_1.aspx,catalog_2.aspx或catalog_3.aspx等之一。ASP.NET - 如何透明地更改請求的頁面名稱?

確實奇怪的要求。這是由於一個遺留的十年陳舊的產品在ASPX上有內聯樣式。我試圖用正則表達式替換它們以獲得適合各種屏幕尺寸的版本,而不是重新編寫數百個ASPX。然後,我會在用戶登錄後測量窗口大小並選擇最好的一個(並可能將大小存儲在cookie中)。

我認爲這將涉及一些像http處理程序一樣的較低級別的對象。關?

LJ

更新:我最終通過URL重寫其效果要好得多這樣做。在asp.net中最簡單的做法是顯示global.asax和Application_BeginRequest事件。調用context.RewritePath(newpath,False)將請求發送到與請求不同的頁面。

以我這樣做的方式,如果回發的收件人不是生成視圖狀態的頁面的確切版本,則目標頁面可能會從請求更改爲請求,並且顯然會擾亂回發。我試圖關閉視圖狀態驗證,但沒有幫助。因此,必須防止在用戶登錄後在版本之間翻轉。希望這可以幫助某人。

回答

0

Server.Transfer可能是最簡單的方法。

string TransferTo = string.Empty; 

if(Something) 
    TransferTo = "catalog_1.aspx"; 
else if(SomethingElse) 
    TransferTo = "catalog_2.aspx"; 
else 
    TransferTo = "catalog_3.aspx"; 

Server.Transfer(TransferTo, false); 

Documentation

注意 如果隨後的頁面有回傳控制,他們將揭示該頁面在該點的真實URL。如果這很重要,那麼這種方法將無法工作。

+0

我想你會遇到問題,如果有這些頁面回發控件。表單上的操作將是'catalog_1.aspx',所以在發佈之後,我相信URL欄將顯示'catalog_1.aspx',而不是'catalog.aspx',除非您在響應中做了更多的調整。 –

+0

你是對的,它會表現得那樣。他們沒有說明,所以我只是尋找最快的選擇。加載頁面後不知道這個問題。 –

+0

供參考:不是OP,所以我不知道這是否會成爲他們的問題... –

0

我不喜歡這種方法,但也許你可以使用全窗口的IFRAME來保存合適的頁面 - catalog.aspx只不過是一個大框架,你可以在代碼隱藏中設置該框架的來源。

+0

謝謝,喬。我簡單地想到了這一點,但問題是頁面內的所有鏈接仍然會指向未加後綴的頁面名稱。我認爲這需要成爲服務器端技巧。 – user788364

相關問題