1

我有一个主页,我想成为我的 Web 应用程序中用户的一种调度中心。所以我希望主页保持打开状态,但是当用户选择某些任务时,我可以对其进行设置,以便使用他们选择的任务创建一个新的选项卡或页面。

我知道如何将控制权转移到另一个页面,但我怎样才能执行类似 Server.Transfer 的操作,只会使新页面出现在新选项卡中,并在旧选项卡/窗口中保持现有页面打开?

举一个我在做什么的例子。我目前在我的主页上有一个中继器,它构建了一个链接按钮列表。LinkBut​​tons 具有来自数据源的文本。用户单击链接按钮后,我想打开一个新页面,并且希望在这个新页面中保留会话状态。

这可以做到吗,怎么做?

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

编辑:我不在乎它是标签还是窗口。我只想能够生成一个新网页并保持现有网页打开。

4

4 回答 4

3

您不能在服务器端更改 UI 行为(例如,通过使用 Server.Transfer 或 Response.Redirect)——它只是不能那样工作。所以,有两种方法可以解决这个问题:

  1. 如果您提前知道哪些特定任务需要打开新窗口/选项卡,请适当设置锚点或表单标签的目标(或使用 javascript 的 window.open() 函数)。
  2. 如果需要在服务器端决定打开新窗口/选项卡,您可以生成并返回满足您需要的 javascript。

请记住,新选项卡/窗口的行为完全取决于浏览器和用户的设置,因此无法保证会发生这种情况 - 某些设置甚至可以强制在同一窗口中打开所有链接,无论目标或调用 window.open()。

如果您使用的是基于 cookie 的会话(这是默认功能),即使在新窗口或新选项卡中,用户仍将使用相同的会话,因此您无需执行任何特殊操作来保留会话状态。

如果您使用的是基于 url(或无 cookie)的会话密钥,则需要确保在使用 javascript 打开新窗口时使用该密钥正确格式化 url。我不是很肯定,但我相信使用目标属性和相对 url 应该会自动生成适当的 url。

于 2009-01-28T16:40:40.660 回答
1

这就是我所做的。

我需要根据他们所做的选择添加一个 Session 状态变量,在 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()">
于 2009-01-28T18:56:45.630 回答
0

我几乎肯定这是不可能的。大多数选项卡式浏览器都有一个可以调整的设置,告诉浏览器应该在哪里启动新页面——在全新的窗口或新选项卡中。

鉴于这是在用户的控制之下的事实,我认为目前没有办法以独立于浏览器的方式实现这一点。虽然如果 IE 的 DOM 扩展所公开的对象模型允许您这样做,我不会感到惊讶。

于 2009-01-28T16:30:44.300 回答
0

它不可能,新页面是否在选项卡中打开,或者新页面由浏览器中的用户设置控制,而不是由代码控制。

于 2009-01-28T16:34:43.903 回答