Response.Radirect для нового окна - PullRequest
116 голосов
/ 19 сентября 2008

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

Ответы [ 20 ]

112 голосов
/ 19 сентября 2008

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

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

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()">
60 голосов
/ 10 февраля 2011

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

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");
26 голосов
/ 19 сентября 2008

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

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

response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");
25 голосов
/ 16 августа 2011

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

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

Тогда:

ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
12 голосов
/ 14 мая 2010

Трюк с исправлением формы хорош, но:

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

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

  3. А ты в зависимости от того что пользователь не будет нажимать другой Кнопка, прежде чем другая страница получает возможность загрузить и запустить fixform.

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

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

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

function fixform() {
   document.getElementById("aspnetForm").target = '';
}
11 голосов
/ 06 мая 2009

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

ClientScript.RegisterStartupScript(this.Page.GetType(), "",
  "window.open('page.aspx','Graph','height=400,width=500');", true);
8 голосов
/ 07 августа 2014

всплывающий метод даст безопасный вопрос посетителю ..

вот мое простое решение: и работать везде.

<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();"/>
8 голосов
/ 19 сентября 2008

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

6 голосов
/ 03 июня 2011
<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/

4 голосов
/ 25 июля 2011

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

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