我有,我想成为一个排序调度中心对我的web应用程序的用户的主页。 所以,我想主要页面的停留开放,但是当用户选择某些任务,我可以将它设置,使一个新的标签或页面与他们所选的任务创建。
我知道如何控制转移到另一个页面,但我怎么可以这样做一个Server.Transfer的唯一做出新的页面出现在新的标签,并保持现有的页面打开旧标签/窗口?
为了让我在做什么的例子。 目前,我有我的主要页面上的中继器构建了LinkButton的列表。 该了LinkButton有从数据源文本。 一旦链接用户点击按钮,我想打开一个新的网页,我想会话状态与此新页面被保留。
可以这样做,以及如何?
我在.NET 3.5使用ASP.NET版本。
编辑:我不在乎是否其选项卡或窗口。 我只是希望能够生成一个新的网页,并保持现有的开放。
您不能更改用户界面行为服务器端(例如,通过使用Server.Transfer的或Response.Redirect的) - 它只是不这样的。 因此,有两种方法可以去这个问题:
- 如果你提前知道的时间,这具体任务需要打开一个新窗口/选项卡中,适当地设置锚点或窗体标记的目标(或使用JavaScript的window.open()函数)。
- 如果打开一个新窗口/标签的决策需要进行服务器端,可以生成并返回的javascript,做你所需要的。
请记住,新的标签/窗口行为是完全依赖于浏览器和用户的设置,所以没有办法保证,这将发生 - 某些设置甚至可以强制在同一个窗口中打开的所有链接,无论目标或调用window.open()。
如果您使用的是基于cookie的会话,这是默认的功能,即使是在新窗口或标签,用户仍将使用同一个会话,所以你不应该做任何特殊保存会话状态。
如果您使用的是基于URL(或无cookie)会话密钥,你需要确保你使用JavaScript打开新窗口时适当地使用密钥格式的URL。 我还不能肯定,但我相信仅仅是使用target属性和相对url应自动生成相应的URL。
这是我做的。
我需要根据他们做出什么选择添加一个会话状态变量,在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()">
我几乎可以肯定这是不可能的。 大多数标签浏览器有一个你可以调整,告诉它应该推出新的网页浏览器的设置 - 在一个全新的窗口或新选项卡。
鉴于这是用户的控制,我不认为这是目前一种方式来获得这个在浏览器无关的方式发生下。 虽然我也不会感到惊讶,如果通过IE浏览器的DOM扩展暴露了对象模型允许你这样做。
它不是possibe,羯羊新页面的标签页中打开,或一个新的页面由用户设置浏览器控制,而不是从代码。