Response.Redirect 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を実行するResponse.Redirect("MyPage.aspx");と、ページが新しいウィンドウで開きます。

追加する必要があるもう1つの部分は、フォームのターゲットを修正することです。そうしないと、すべてのリンクが新しいウィンドウで開きます。これを行うには、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

さらに、仮想ディレクトリ外のページにリダイレクトする場合、セキュリティ違反が発生する可能性があります。
Drejc 2008

1
どういうわけか私の場合、それは機能していません。新しいウィンドウで同じページを開いて、そのページへの応答を書き込んでいます。しかし、マスターページでfixform()メソッドを保持すると、ドキュメントがnullであるというエラーがスローされます。なぜそれがまだ解決策を見つけようとして投げているのかわからない。onClientClick = "aspnetForm.target = '';"を使用して一時的な解決策を考え出しましたが、そのページの他のボタンのプロパティ。
JPReddy 2010年

1
私はこれを試したところ、代わりOnClientClick="aspnetForm.target ='_blank';"に使用する必要がありましたOnClientClick="document.getElementById('Form').target ='_blank';"
colincameron

はい、うまくいきましたが、新しいウィンドウではなく新しいタブでページを開いています。ページを新しいウィンドウで開くにはどうすればよいですか?
Shilpa Soni 2014

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 2013年

おい、これは実際に機能する素晴らしいソリューションです!ありがとうございました。
Klaus Nji、2014年

優れた再利用可能なソリューション!唯一の欠点は、新しいウィンドウがポップアップブロッカーによってブロックされるという事実です。
MeanGreen

最初の引数は現在のResponseオブジェクトです。
2018年

フィードバックをありがとう!
ササタンセフ

26

Response.Redirectはサーバー上で開始されるため、それを使用して実行することはできません。

応答ストリームに直接書き込むことができる場合は、次のようなことを試すことができます。

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

3
これは機能しますが、私のボタンが表示されるページの変更は、CSSまたはDIVSのように影響を受けます。
エティエンヌ

前後に移動するたびに新しいウィンドウがポップアップします。
devXen 2011年

26

クリックイベントハンドラーを使用してURLを作成します。

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

次に:

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

ポップアップブロッカーは、この周りの他のWAのURLをブロックしますか?
ラファイ2013年

3
この例のwindow.openは、ユーザーアクションではなくコードによって開始されるため、常に「ポップアップ」として扱われます。ユーザーが要素をクリックしたときにwindow.openが呼び出された場合、ブラウザによるブロックされたポップアップアクションを回避する必要があります。
2013年

@steve、これは優れた非常にシンプルなソリューションです。Response.Redirectへのアプローチをポップアップに使用しました。
スニル2014

14

フィックスフォームのトリックは素晴らしいですが、:

  1. 新しいウィンドウに読み込まれるコードにアクセスできない場合があります。

  2. あなたがそうしたとしても、あなたはそれが常にロードされ、エラーのない事実に依存しています。

  3. そして、他のページがフィックスフォームをロードして実行する機会を得る前に、ユーザーが別のボタンをクリックしないという事実に依存しています。

代わりにこれを行うことをお勧めします:

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
これは私にとってはうまくいき、基本的には上記のAbhishek Shrivastavaのソリューションの短縮版です。ただし、いくつかの注意点があります。まず、これによりポップアップブロッカーがトリガーされます。特に、Safariはブロックされたポップアップのプロンプトを表示せず、ポップアップの例外を作成できないため、ポップアップブロッカーが有効になっている場合、Safari 5.0ではまったく機能しません。次に、Chromeはwindow.openへのページ引数を無視します。そのため、window.open('page.aspx','_blank');それを使用しても、新しいタブではなく、ナビゲーションバーが無効でナビゲーションボタンがない新しいウィンドウで開きます。
Kasey Speakman、2011年

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");を呼び出します。ボタンイベントの背後。


このメソッドは、OnClientClickonclickの両方をトリガーします。新しいウィンドウでいくつかのページが開かれ、同じページでいくつかのアクションが行われたことを意味します
Manivannan Nagarajan 14

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クラスに影響を与えないため、親ウィンドウはまったく影響を受けません。
Abhishek Shrivastava 2010

1
まあ、これは確かにMVCの強力な議論です。コードから何も奪わないこと。それから遠い。Webフォームを代表するのはこのようなものです。
MrBoJangles 2010

このコードはすべて1行にまとめることができます...以下のshaluのソリューションを参照してください。まったく同じ効果ですが、不要な膨張はありません。
Kasey Speakman、2011年

1

上記の@takrlおよび@tomによる回答に基づくjQueryバージョンは次のとおりです。注:ハードコードされたformid(上記のaspnetFormという名前)はなく、Firefoxで問題が発生する可能性のある直接form.target参照も使用しません。

<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

LinkBut​​tonの代わりにHyperlinkを使用しましたが、うまく機能しました。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

ここで行ったようにajaxを使用してasp.netコードの背後から新しいウィンドウ開くことができます 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);
    });
});

使用するには、任意の要素にクラス「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";}

AND分離コード:

Response.Redirect(URL); 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.