2009-01-28 88 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()"> 
相关问题