Response.Redirect в новом окне

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

Ответ 1

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

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

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

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

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

Ответ 3

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

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

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

Ответ 4

Конкретизируйте свой URL с помощью обработчика событий click:

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

Тогда:

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

Ответ 5

Фиксированный трюк опрятен, но:

  • У вас может не быть доступа к коду из каких нагрузок в новом окне.

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

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

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

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

И настройте исправление на той же странице, выглядя так:

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

Ответ 6

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

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

Ответ 7

Это невозможно с 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();"/>

Ответ 10

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

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

Ответ 11

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

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

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

Ответ 12

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

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 ());
     }

Ответ 13

Здесь версия jQuery, основанная на ответе @takrl и @tom выше. Примечание: нет hardcoded 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','');
}

Ответ 14

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

Ответ 15

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

Ответ 16

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

Ответ 17

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

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

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

Ответ 18

Я использовал этот подход, он не требует, чтобы вы что-либо делали во всплывающем окне (к которому у меня не было доступа, потому что я перенаправлялся в файл 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 target
        $("#aspnetForm").prop("target", "_blank");

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

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

Ответ 19

Я сделал это, поставив target = "_ blank" в linkbutton

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

то в файле codebehind pageload просто установите атрибут href:

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