Вопрос по asp.net, c# – Response.Radirect для нового окна

116

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

Ваш Ответ

20   ответов
25

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

Затем:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
Блокировщик всплывающих окон блокирует URL любого другого ва вокруг этого ??
+5 @ Стив, хороший
window.open в этом примере всегда будет обрабатываться как «всплывающее окно» поскольку он инициируется кодом, а не действием пользователя. если window.open вызывается, когда пользователь нажимает на элемент, это должно обойти заблокированное всплывающее действие браузера.
@steve, это отличное и очень простое решение. Я использовал ваш подход к Response.Redirect для всплывающего окна.
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'); он по-прежнему открывает его в новом окне с отключенной панелью навигации и отсутствием кнопок навигации вместо новой вкладки.
3

Use this code

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 ());
     }
Весь этот код может быть сведен к одной строке ... см. Решение shalu ниже. Это точно такой же эффект, но без всего ненужного раздувания.
Ну, это, безусловно, сильный аргумент для MVC. Не отнимать ничего от вашего кода. Отнюдь не. Это такие вещи, которые типизируют веб-формы, блех.
Этот код никогда не повлияет на класс CSS, поэтому родительское окно не будет затронуто вообще !!
4

чтобы открыть новую страницу в новой вкладке.

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

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

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

<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)
8

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

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. Эта функция устанавливает новое окно и фиксирует его в той же функции.

1

основанная на ответах @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','');
}
6
<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 не определено.
Этот работал для меня идеально. :)
112

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

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()">
Я только что попробовал это и вместоOnClientClick="aspnetForm.target ='_blank';" Я должен был использоватьOnClientClick="document.getElementById('Form').target ='_blank';"
это работает, если Javascript отключен?
Нет, поскольку это использует JavaScript, чтобы изменить цель формы. Вместо этого страница будет отправлена как обычно.
Кроме того, у вас может быть нарушение безопасности, если вы хотите перенаправить на страницу за пределами вашего виртуального каталога.
Как-то в моем случае это не работает. Я открываю ту же страницу в новом окне и записываю ответ на эту страницу. Но когда я сохраняю метод fixform () на главной странице, он выдает ошибку, говоря, что документ пуст. Не уверен, почему он бросает все еще пытаясь найти решение. Хотя я и нашел временное решение, используя onClientClick = & quot; aspnetForm.target = & quot; & quot; свойство для других кнопок на этой странице.
26

вы не можете сделать это, используя это.

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

response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");
Это работает. Но это влияет на мою реальную страницу.
Это работает, но затем изменяется страница, где моя кнопка изменяется, как CSS или DIVS.
новое окно появляется каждый раз при переходе назад и вперед.
60

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");
Спас мне жизнь, спасибо большое. Это прекрасно работает.
ты спас меня снова спасибо
Чувак, это фантастическое решение, которое действительно работает! Спасибо.
Отличное многоразовое решение! Единственным недостатком является тот факт, что новое окно заблокировано блокировщиком всплывающих окон.
что я должен отправить за первый аргумент?
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);
}
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 "]";
0

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

Javascript:

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

И код позади:

Response.Redirect(URL); 
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;";
}
1

и он работал нормально, у него есть свойство 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

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

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

чтобы обеспечить запуск JavaScript при загрузке страницы.

12

You may not have access to the code of what loads in the new window.

Even if you do, you are depending on the fact that it always loads, error free.

And you are depending on the fact that the user won't click another button before the other page gets a chance to load and run fixform.

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

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

И настроить fixform наsame pageвыглядит так:

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

Похожие вопросы