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


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.