2009-01-28 51 views
1

我有一個主頁面,我想成爲我的Web應用程序中用戶的一種調度中心。所以我希望主頁面保持打開狀態,但是當用戶選擇某些任務時,我可以進行設置,以便使用他們選擇的任務創建新的選項卡或頁面。爲ASP.NET中的網頁創建新的選項卡或窗口

我知道如何將控制轉移到另一個頁面,但我怎麼能做一些像Server.Transfer這樣的新頁面出現在一個新的選項卡,並保持現有的頁面在舊的選項卡/窗口中打開?

舉例說明我在做什麼。我目前在我的主頁上有一箇中繼器,它構建了一個LinkBut​​tons列表。 LinkBut​​tons具有來自數據源的文本。一旦用戶點擊鏈接按鈕,我想打開一個新頁面,並希望會話狀態通過這個新頁面保留。

可以這樣做,以及如何?

我在.NET 3.5中使用ASP.NET的版本。

編輯:我不在乎它是一個製表符還是窗口。我只是想能夠產生一個新的網頁,並保持現有的網頁打開。

回答

3

您無法更改服務器端的UI行爲(例如,通過使用Server.Transfer或Response.Redirect) - 它不會以這種方式工作。因此,有兩種方法,你可以去了解這一點:

  1. 如果你事先知道哪些特定的任務需要打開一個新窗口/選項卡中,適當地設置錨點或窗體標記的目標(或使用JavaScript的窗口。 open()函數)。
  2. 如果決定打開一個新窗口/選項卡需要作爲服務器端,您可以生成並返回所需的JavaScript。

請記住,新的標籤頁/窗口行爲完全取決於瀏覽器和用戶的設置,因此無法保證會發生什麼 - 某些設置甚至可以強制所有鏈接在同一個窗口中打開,而不管目標或調用window.open()。

如果您使用的是基於cookie的會話,這是默認功能,即使在新窗口或選項卡中,用戶仍將使用同一個會話,因此您不必執行任何特殊的操作來保存會話狀態。

如果您使用的是基於網址(或無cookie)的會話密鑰,則需要確保在使用javascript打開新窗口時使用密鑰正確地格式化網址。我不積極,但我相信只要使用目標屬性和相關的url應該會自動生成適當的url。

0

我幾乎肯定這是不可能的。大多數選項卡式瀏覽器都有一個設置,您可以調整它來告訴瀏覽器它應該在哪裏啓動新頁面 - 在全新窗口或新選項卡中。

鑑於這是在用戶的控制之下,我認爲目前沒有辦法以獨立於瀏覽器的方式發生這種情況。儘管如果IE的DOM擴展暴露的對象模型允許你這樣做,我不會感到驚訝。

0

不可能,新頁面在標籤中打開,或者新頁面由瀏覽器中的用戶設置控制,而不是來自代碼。

1

這就是我所做的。

我需要根據他們做出什麼選擇添加一個會話狀態變量,在Firefox,它會導致一個新的標籤,這是很好:

在調度頁面,我只是用Server.Transfer的去到新頁面(添加會話狀態之後),但是,在新頁面上,我運行一個onload腳本。這裏是我的代碼:

在項目命令事件處理程序調度頁:

protected void RecentButtonsRepeater_ItemCommand(object source, 
    RepeaterCommandEventArgs e) 
{ 
    string code = ((LinkButton)e.Item.Controls[1]).Text; 
    string sql = "SELECT RunID FROM ProductionRuns WHERE RunCode = @code"; 
    SqlConnection sqlconn = new SqlConnection(QCDataPath); 
    sqlconn.Open(); 
    SqlCommand sqlcomm = new SqlCommand(sql, sqlconn); 
    sqlcomm.Parameters.AddWithValue("@code", code); 
    SqlDataReader sdr = sqlcomm.ExecuteReader(); 

    sdr.Read(); 

    int id = sdr.GetInt32(0); 

    sdr.Close(); 
    sqlconn.Close(); 

    Session["RunID"] = id; 
    Server.Transfer("Sheet.aspx"); 
} 

而在Sheet.aspx標記:

<script type="text/javascript"> 
    function ReOpenScoreHome() { 
     window.open("Scoresheets.aspx", "reopenwindow"); 
    } 
</script> 
</head> 
<body onload="ReOpenScoreHome()"> 
相關問題