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


118

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

Ответы:


114

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

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

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

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

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

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

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

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

62

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

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

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

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

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

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

Спасибо за отзыв!
— Саша Танцев

26

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

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

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

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

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

26

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

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

Затем:

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

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

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

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

14

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

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

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

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

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

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

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

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

11

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

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

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

8

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


8

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"]'
— Никсо


4

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

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

4

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

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

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


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

3

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

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, поэтому на родительское окно это никак не повлияет !!
— Абхишек Шривастава

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

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

1

Вот версия 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','');
}

1

Я использовал 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>

0

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


0

вы можете открыть новое окно из кода 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);
}

0

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

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

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


0

Я использовал этот подход, он не требует от вас ничего делать во всплывающем окне (к которому у меня не было доступа, потому что я перенаправлял на файл 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 ничего добавлять не нужно. Эта функция устанавливает новое окно и исправляет его в той же функции.


0

Я сделал это, поместив 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)

0

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); 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.