Ответ: перейти в новое окно

Я хочу использовать Response.Redirect("MyPage.aspx"), но открыть его в новом окне браузера. Я делал это раньше, не используя метод сценария регистрации JavaScript. Я просто не могу вспомнить как?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
118
0
442 958
20

Ответы 20

Это невозможно с Response.Redirect, поскольку это происходит на стороне сервера и не может указать вашему браузеру выполнить это действие. Что останется в начальном окне? Пустая страница?

Поскольку Response.Redirect инициируется на сервере, вы не можете сделать это с помощью этого.

Если вы можете писать прямо в поток ответов, вы можете попробовать что-то вроде:

response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");

Это работает, но затем страница, на которой находится моя кнопка, изменяется, как CSS или DIVS.

Etienne 21.10.2009 13:02

новое окно всплывает каждый раз при переходе вперед и назад.

devXen 15.06.2011 03:17

Вы можете использовать Page.RegisterStartupScript, чтобы гарантировать, что javascript срабатывает при загрузке страницы.

Я только что нашел ответ, и он работает :)

Вам необходимо добавить следующую ссылку / кнопку на стороне сервера:

OnClientClick = "aspnetForm.target ='_blank';"

Весь мой код кнопки выглядит примерно так:

<asp:LinkButton ID = "myButton" runat = "server" Text = "Click Me!" 
                OnClick = "myButton_Click" 
                OnClientClick = "aspnetForm.target ='_blank';"/>

На стороне сервера OnClick я делаю Response.Redirect("MyPage.aspx");, и страница открывается в новом окне.

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

<script type = "text/javascript">
    function fixform() {
        if (opener.document.getElementById("aspnetForm").target != "_blank") return;
        opener.document.getElementById("aspnetForm").target = "";
        opener.document.getElementById("aspnetForm").action = opener.location.href;
    }
</script>

и

<body onload = "fixform()">

Нет, поскольку здесь используется javascript для изменения цели формы. Вместо этого страница будет отправлена ​​как обычно.

Toby Mills 20.09.2008 01:44

Кроме того, у вас может быть нарушение безопасности, если вы хотите перенаправить на страницу за пределами вашего виртуального каталога.

Drejc 23.09.2008 01:42

Как-то в моем случае это не работает. Я открываю ту же страницу в новом окне и пишу ответ на эту страницу. Но когда я сохраняю метод fixform () на главной странице, он выдает ошибку, говоря, что документ имеет значение null. Не уверен, почему это бросает все еще пытается найти решение. Хотя я придумал временное решение, используя onClientClick = "aspnetForm.target = '';" свойство для других кнопок на этой странице.

JPReddy 25.06.2010 14:42

Я только что попробовал, и вместо OnClientClick = "aspnetForm.target ='_blank';" мне пришлось использовать OnClientClick = "document.getElementById('Form').target ='_blank';"

colincameron 14.11.2012 15:03

Да, у меня это сработало, но страница открывается в новой вкладке, а не в новом окне. Как я могу открыть свою страницу в новом окне?

Shilpa Soni 03.09.2014 10:48

@ShilpaSoni, который зависит от настроек браузера, вы ничего не можете сделать в коде, чтобы принудительно открыть новое окно вместо новой вкладки, за исключением использования модального окна или окна сообщения AFAIK.

eddie_cat 26.11.2014 18:31

Имя моей формы не было aspnetForm, поэтому мне нужно было проверить в Google Chrome Dev Tools идентификатор моей формы, затем я изменил его следующим образом: OnClientClick = "myform.target ='_blank';"

Guilherme de Jesus Santos 04.06.2018 15:40

Вы можете избавиться от части "fixform", просто определив свою форму с помощью target = "_self", поэтому target = "_blank" переопределит только текущую страницу <form id = "aspnetForm" runat = "server" target = "_self">.

Stefano Losi 16.02.2019 13:11

Вы также можете использовать в коде таким образом

ClientScript.RegisterStartupScript(this.Page.GetType(), "",
  "window.open('page.aspx','Graph','height=400,width=500');", true);

Это отлично работает для меня и, по сути, является краткой версией решения Абхишека Шриваставы, приведенного выше. Однако есть несколько предостережений, о которых следует помнить. Во-первых, это активирует блокировщики всплывающих окон. В частности, он вообще не будет работать в Safari 5.0, если включен блокировщик всплывающих окон, поскольку Safari не запрашивает заблокированные всплывающие окна и не позволяет создавать исключения из всплывающих окон. Во-вторых, Chrome игнорирует аргумент страницы для window.open. Таким образом, даже если вы используете window.open('page.aspx','_blank');, он все равно открывает его в новом окне с отключенной панелью навигации и отсутствующими кнопками навигации вместо новой вкладки.

Kasey Speakman 15.06.2011 02:30

Уловка с фиксацией формы проста, но:

  1. Возможно, у вас нет доступа к коду того, что загружается в новом окне.

  2. Даже если вы это сделаете, вы зависите от тот факт, что он всегда загружается, ошибка свободный.

  3. И вы в зависимости от факта что пользователь не нажмет другой кнопку, прежде чем другая страница получит шанс загрузить и запустить fixform.

Я бы предложил сделать это вместо этого:

OnClientClick = "aspnetForm.target ='_blank';setTimeout('fixform()', 500);"

И настройте fixform на та же страница, как это:

function fixform() {
   document.getElementById("aspnetForm").target = '';
}

Я всегда использую этот код ... Используйте этот код

String clientScriptName = "ButtonClickScript";
Type clientScriptType = this.GetType ();

// Get a ClientScriptManager reference from the Page class.
ClientScriptManager clientScript = Page.ClientScript;

// Check to see if the client script is already registered.
if (!clientScript.IsClientScriptBlockRegistered (clientScriptType, clientScriptName))
    {
     StringBuilder sb = new StringBuilder ();
     sb.Append ("<script type='text/javascript'>");
     sb.Append ("window.open(' " + url + "')"); //URL = where you want to redirect.
     sb.Append ("</script>");
     clientScript.RegisterClientScriptBlock (clientScriptType, clientScriptName, sb.ToString ());
     }

Этот код никогда не повлияет на класс CSS, поэтому на родительское окно это никак не повлияет !!

Abhishek Shrivastava 26.08.2010 22:19

Что ж, это, безусловно, веский аргумент в пользу MVC. Ничего не убирать из кода. Отнюдь не. Такие вещи типичны для веб-форм, черт.

MrBoJangles 29.12.2010 01:19

Весь этот код можно сжать до одной строки ... см. Решение shalu ниже. Это точно такой же эффект, но без ненужного раздувания.

Kasey Speakman 15.06.2011 02:33

вы можете открыть новое окно из кода asp.net позади, используя ajax, как я здесь http://alexandershapovalov.com/open-new-window-from-code-behind-in-aspnet-68/

protected void Page_Load(object sender, EventArgs e)
{
    Calendar1.SelectionChanged += CalendarSelectionChanged;
}

private void CalendarSelectionChanged(object sender, EventArgs e)
{
    DateTime selectedDate = ((Calendar) sender).SelectedDate;
    string url = "HistoryRates.aspx?date = "
+ HttpUtility.UrlEncode(selectedDate.ToShortDateString());
    ScriptManager.RegisterClientScriptBlock(this, GetType(),
"rates" + selectedDate, "openWindow('" + url + "');", true);
}

Вы можете использовать это как метод расширения

public static class ResponseHelper
{ 
    public static void Redirect(this HttpResponse response, string url, string target, string windowFeatures) 
    { 

        if ((String.IsNullOrEmpty(target) || target.Equals("_self", StringComparison.OrdinalIgnoreCase)) && String.IsNullOrEmpty(windowFeatures)) 
        { 
            response.Redirect(url); 
        } 
        else 
        { 
            Page page = (Page)HttpContext.Current.Handler; 

            if (page == null) 
            { 
                throw new InvalidOperationException("Cannot redirect to new window outside Page context."); 
            } 
            url = page.ResolveClientUrl(url); 

            string script; 
            if (!String.IsNullOrEmpty(windowFeatures)) 
            { 
                script = @"window.open(""{0}"", ""{1}"", ""{2}"");"; 
            } 
            else 
            { 
                script = @"window.open(""{0}"", ""{1}"");"; 
            }
            script = String.Format(script, url, target, windowFeatures); 
            ScriptManager.RegisterStartupScript(page, typeof(Page), "Redirect", script, true); 
        } 
    }
}

Благодаря этому вы получаете отличное переопределение фактического объекта Response

Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");

что я должен послать в качестве первого аргумента?

Raghuveera 25.10.2013 10:19

Чувак, это фантастическое решение, которое действительно работает! Спасибо.

Klaus Nji 15.11.2014 00:31

Отличное многоразовое решение! Единственным недостатком является то, что новое окно блокируется блокировщиком всплывающих окон.

MeanGreen 12.06.2015 10:49

Первый аргумент - это ваш текущий объект Response.

Futureproof 03.03.2018 00:12

Спасибо за отзыв!

Sasa Tancev 19.09.2019 18:03

<asp:Button ID = "btnNewEntry" runat = "Server" CssClass = "button" Text = "New Entry"

OnClick = "btnNewEntry_Click" OnClientClick = "aspnetForm.target ='_blank';"/>

protected void btnNewEntry_Click(object sender, EventArgs e)
{
    Response.Redirect("New.aspx");
}

Источник: http://dotnetchris.wordpress.com/2008/11/04/c-aspnet-responseredirect-open-into-new-window/

в нем говорится, что aspnetForm не определен.

Naresh 06.06.2011 10:48

Если вы можете реструктурировать свой код так, чтобы вам не требовалась обратная передача, то вы можете использовать этот код в событии PreRender кнопки:

protected void MyButton_OnPreRender(object sender, EventArgs e)
{
    string URL = "~/MyPage.aspx";
    URL = Page.ResolveClientUrl(URL);
    MyButton.OnClientClick = "window.open('" + URL + "'); return false;";
}

Создайте свой URL-адрес с помощью обработчика события щелчка:

string strUrl = "/some/url/path" + myvar;

Потом:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);

Блокировщик всплывающих окон блокирует любой другой URL-адрес вокруг этого ??

Rafay 25.11.2013 10:20

window.open в этом примере всегда будет рассматриваться как «всплывающее окно», поскольку оно инициируется кодом, а не действием пользователя. если window.open вызывается, когда пользователь нажимает на элемент, это должно обойти заблокированное действие всплывающего окна браузера.

steve 27.11.2013 22:50

@steve, это отличное и очень простое решение. Я использовал ваш подход к Response.Redirect во всплывающем окне.

Sunil 01.05.2014 00:29

Вот версия jQuery, основанная на ответе @takrl и @tom выше. Примечание: нет жестко запрограммированного formid (названного выше aspnetForm), а также не используются прямые ссылки form.target, которые Firefox может счесть проблематичными:

<asp:Button ID = "btnSubmit" OnClientClick = "openNewWin();"  Text = "Submit" OnClick = "btn_OnClick" runat = "server"/>

Затем в вашем js-файле, указанном на ОДНОЙ странице:

function openNewWin () {
    $('form').attr('target','_blank');
    setTimeout('resetFormTarget()', 500);
}

function resetFormTarget(){
    $('form').attr('target','');
}

Я использовал Hyperlink вместо LinkButton, и он работал нормально, у него есть свойство Target, поэтому я решил мою проблему. Было решение с Response.Write, но это испортило мой макет, а тот, что с ScriptManager, при каждом обновлении или возврате снова открывал окно. Вот как я это решил:

<asp:HyperLink CssClass = "hlk11" ID = "hlkLink" runat = "server" Text='<%# Eval("LinkText") %>' Visible='<%# !(bool)Eval("IsDocument") %>' Target = "_blank" NavigateUrl='<%# Eval("WebAddress") %>'></asp:HyperLink>

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

<asp:Button ID = "Button1" runat = "server" Text = "Go" 
  OnClientClick = "window.open('yourPage.aspx');return false;" 
  onclick = "Button3_Click" />

И просто вызовите Response.Redirect ("yourPage.aspx"); за событием кнопки.

Этот метод запускает как OnClientClick, так и по щелчку. Означает, что какая-то страница открыта в новом окне, а также какое-то действие было выполнено на той же странице

Manivannan Nagarajan 24.02.2014 13:11

Ни один из предыдущих примеров у меня не работал, поэтому я решил опубликовать свое решение. В событиях нажатия кнопки вот код.

Dim URL As String = "http://www.google/?Search = " + txtExample.Text.ToString
URL = Page.ResolveClientUrl(URL)
btnSearch.OnClientClick = "window.open('" + URL + "'); return false;"

Мне пришлось изменить чужой код response.redirect, чтобы он открывался в новом браузере.

Я использовал этот подход, он не требует, чтобы вы что-либо делали во всплывающем окне (к которому у меня не было доступа, потому что я перенаправлял на файл PDF). Он также использует классы.

$(function () {
    //--- setup click event for elements that use a response.redirect in code behind but should open in a new window
    $(".new-window").on("click", function () {

        //--- change the form's target
        $("#aspnetForm").prop("target", "_blank");

        //--- change the target back after the window has opened
        setTimeout(function () {
            $("#aspnetForm").prop("target", "");
        }, 1);
    });
});

Чтобы использовать, добавьте класс «новое окно» к любому элементу. В тег body ничего добавлять не нужно. Эта функция устанавливает новое окно и исправляет его в той же функции.

popup предложит посетителю безопасный вопрос.

вот мое простое решение: и работаю везде.

<script type = "text/javascript">
    function targetMeBlank() {
        document.forms[0].target = "_blank";
    }
</script>

<asp:linkbutton  runat = "server" ID = "lnkbtn1" Text = "target me to blank dude" OnClick = "lnkbtn1_Click" OnClientClick = "targetMeBlank();"/>

Я не могу отредактировать ваше сообщение, так как в нем не менее 6 символов, но это не '("href")', это '["href"]'

Nickso 07.03.2019 20:17

Я сделал это, поместив target = "_ blank" в кнопку ссылки.

<asp:LinkButton ID = "btn" runat = "server" CausesValidation = "false"  Text = "Print" Visible = "false" target = "_blank"  />

затем в загрузке страницы с выделенным кодом просто установите атрибут href:

btn.Attributes("href") = String.Format(ResolveUrl("~/") + "test/TestForm.aspx?formId = {0}", formId)

HTML

<asp:Button ID = "Button1" runat = "server" Text = "Button" onclick = "Button1_Click" OnClientClick = "SetTarget();" />

Javascript:

function SetTarget() {
 document.forms[0].target = "_blank";}

И код позади:

Response.Redirect(URL); 

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