Response.Reireire to new window


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 I do a 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 для зміни цілі форми. Натомість сторінка надсилатиметься як зазвичай.
Toby Mills

Плюс у вас може виникнути порушення безпеки, якщо ви хочете перенаправити на сторінку поза віртуального каталогу.
Дрейк

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

1
Я тільки що спробував це, а замість цього OnClientClick="aspnetForm.target ='_blank';"довелося використовуватиOnClientClick="document.getElementById('Form').target ='_blank';"
colincameron

Так, це спрацювало для мене, але це відкриття сторінки на новій вкладці, а не в новому вікні. Як я можу відкрити свою сторінку в новому вікні?
Шилпа Соні

61

Ви можете використовувати це як метод розширення

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

Чувак, це фантастичне рішення, яке насправді працює! Дякую.
Klaus Nji

Відмінне багаторазове рішення! Єдиним недоліком є ​​той факт, що нове вікно блокується блокувальником спливаючих вікон.
MeanGreen

Перший аргумент - ваш поточний об’єкт Response.
Майбутнє

Дякуємо за відгук!
Саса Танцев

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-адресу будь-якого іншого ??
Рафай

3
window.open у цьому прикладі завжди розглядатиметься як 'popup', оскільки він ініційований кодом, а не діями користувача. якщо window.open викликається, коли користувач натискає на елемент, який повинен перейти до заблокованої спливаючої дії браузером.
steve

@steve, Це відмінне і дуже просте рішення. Я використовував ваш підхід до Response.Redirect на спливаюче вікно.
Суніл

14

Виправданий трюк акуратний, але:

  1. Ви можете не мати доступу до коду того, що завантажується у новому вікні.

  2. Навіть якщо ви це зробите, ви залежите від того, що він завжди завантажується, без помилок.

  3. І ви залежаєте від того, що користувач не натисне іншу кнопку, перш ніж інша сторінка отримає шанс завантажити та запустити форму виправлення.

Я б запропонував зробити це замість цього:

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

І встановіть форму виправлення на цю ж сторінку , виглядаючи так:

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');ним, він все одно відкриє його в новому вікні, де панель навігації вимкнена та кнопки навички відсутні замість нової вкладки.
Спікер Кейсі

8

Це неможливо за допомогою Response.Redirect, як це відбувається на стороні сервера, і не може спрямовувати ваш веб-переглядач на здійснення цих дій. Що залишилося б у початковому вікні? Пуста сторінка?


8

метод спливаючих вікон дасть безпечне запитання відвідувачеві ..

ось моє просте рішення: і працювати скрізь.

<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


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 . Мається на увазі, що якась сторінка відкривається у новому вікні, а також було зроблено певну дію на тій же сторінці
Manivannan Nagarajan

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

Весь цей код можна стиснути до одного рядка ... див. Рішення шалу нижче. Це точно такий же ефект, але без усього зайвого набряку.
Спікер Кейсі

1

Ось версія jQuery, заснована на відповідях @takrl та @tom вище. Примітка: жоден жорсткий кодування formid (названий вище aspnetForm), а також не використовує прямі посилання form.target, які Firefox можуть вважати проблематичними:

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

Потім у вашому js-файлі, на який посилається SAME:

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

Мені довелося змінити чужий код answer.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);
    });
});

Для використання додайте клас "new-window" до будь-якого елемента. Вам не потрібно нічого додавати до тегу 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.