Создайте новую вкладку или окно для веб-страницы из ASP.NET

StackOverflow https://stackoverflow.com/questions/488311

  •  20-08-2019
  •  | 
  •  

Вопрос

У меня есть главная страница, которую я хочу сделать своего рода диспетчерским центром для пользователя в моем веб-приложении.Поэтому я хочу, чтобы главная страница оставалась открытой, но когда пользователь выбирает определенные задачи, я могу настроить ее так, чтобы создавалась новая вкладка или страница с выбранной им задачей.

Я знаю, как перенести управление на другую страницу, но как я могу сделать что-то вроде сервера.При переносе новая страница отображается только на новой вкладке, а существующая страница остается открытой на старой вкладке / окне?

Чтобы привести пример того, что я делаю.В настоящее время у меня есть ретранслятор на моей главной странице, который создает список LinkButtons.Кнопки ссылок содержат текст из источника данных.Как только пользователь нажимает на кнопку ссылки, я хочу открыть новую страницу, и я хочу, чтобы состояние сеанса было сохранено на этой новой странице.

Можно ли это сделать и как?

Я использую версию ASP.NET в .NET 3.5.

Редактировать:Мне все равно, вкладка это или окно.Я просто хочу иметь возможность создать новую веб-страницу и оставить существующую открытой.

Это было полезно?

Решение

Вы не можете изменить поведение пользовательского интерфейса на стороне сервера (например, с помощью Server.Transfer или Response.Перенаправление) - это просто так не работает.Итак, есть два способа, которыми вы можете это сделать:

  1. Если вы заранее знаете, какие конкретные задачи требуют открытия нового окна / вкладки, соответствующим образом установите целевые теги привязки или формы (или используйте функцию window.open() javascript).
  2. Если решение об открытии нового окна / вкладки должно приниматься на стороне сервера, вы можете сгенерировать и вернуть javascript, который делает то, что вам нужно.

Имейте в виду, что поведение новой вкладки / окна полностью зависит от браузера и настроек пользователя, поэтому нет способа гарантировать, что произойдет - некоторые настройки могут даже принудительно открывать все ссылки в одном окне, независимо от цели или вызова window.open().

Если вы используете сеанс на основе файлов cookie, который является функцией по умолчанию, даже в новом окне или вкладке пользователь все равно будет использовать тот же сеанс, поэтому вам не нужно делать ничего особенного для сохранения состояния сеанса.

Если вы используете сеансовый ключ на основе URL (или без использования cookies), вам нужно будет убедиться, что вы соответствующим образом форматируете URL с помощью ключа при открытии новых окон с помощью javascript.Я не уверен, но я просто считаю, что использование целевого атрибута и относительных URL-адресов должно автоматически генерировать соответствующий URL.

Другие советы

Это то, что я сделал.

Мне нужно было добавить переменную состояния сеанса в зависимости от того, какой выбор они сделали, и в Firefox это приводит к созданию новой вкладки, которая приятна:

На странице отправки я просто использую Server.Transfer для перехода на новую страницу (после добавления состояния сеанса), однако на новой странице я запускаю скрипт onload.Вот мой код:

В обработчике события Item Command для страницы отправки:

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()">

Я почти уверен, что это невозможно.В большинстве браузеров с вкладками есть настройка, которую вы можете настроить, указывающая браузеру, где он должен запускать новые страницы - в совершенно новом окне или на новой вкладке.

Учитывая тот факт, что это находится под контролем пользователя, я не думаю, что в настоящее время существует способ сделать это независимым от браузера способом.Хотя я бы не удивился, если объектная модель, предоставляемая расширениями DOM IE, позволит вам это сделать.

Это невозможно, независимо от того, открываются ли новые страницы на вкладке, или новая страница управляется пользовательскими настройками в браузере, а не кодом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top