Phản hồi. Chuyển hướng đến cửa sổ mới


118

Tôi muốn thực hiện Response.Redirect("MyPage.aspx")nhưng mở nó trong cửa sổ trình duyệt mới. Tôi đã thực hiện điều này trước đây mà không sử dụng phương thức tập lệnh đăng ký JavaScript. Tôi chỉ không thể nhớ làm thế nào?

Câu trả lời:


114

Tôi chỉ tìm thấy câu trả lời và nó hoạt động :)

Bạn cần thêm thông tin sau vào liên kết / nút phía máy chủ của mình:

OnClientClick="aspnetForm.target ='_blank';"

Toàn bộ mã nút của tôi trông giống như sau:

<asp:LinkButton ID="myButton" runat="server" Text="Click Me!" 
                OnClick="myButton_Click" 
                OnClientClick="aspnetForm.target ='_blank';"/>

Trong OnClick phía máy chủ, tôi thực hiện Response.Redirect("MyPage.aspx");và trang được mở trong một cửa sổ mới.

Một phần khác bạn cần thêm là sửa mục tiêu của biểu mẫu nếu không mọi liên kết sẽ mở ra trong một cửa sổ mới. Để làm như vậy, hãy thêm phần sau vào tiêu đề của cửa sổ POPUP của bạn.

<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
Không vì điều này sử dụng javascript để thay đổi mục tiêu của biểu mẫu. Thay vào đó, trang sẽ gửi như bình thường.
Toby Mills

Ngoài ra, bạn có thể vi phạm bảo mật nếu bạn muốn chuyển hướng đến một trang bên ngoài thư mục ảo của mình.
Drejc 22/09/08

1
Bằng cách nào đó trong trường hợp của tôi, nó không hoạt động. Tôi đang mở cùng một trang trong cửa sổ mới và viết phản hồi cho trang đó. Nhưng khi tôi giữ phương thức fixform () trong trang chủ, nó ném ra lỗi nói rằng tài liệu là null. Không rõ tại sao nó đang ném vẫn cố gắng tìm ra giải pháp. Mặc dù tôi đã nghĩ ra một giải pháp tạm thời bằng cách sử dụng onClientClick = "aspnetForm.target = '';" thuộc tính cho các nút khác trên trang đó.
JPReddy

1
Tôi đã chỉ cố gắng này và thay vì OnClientClick="aspnetForm.target ='_blank';"tôi phải sử dụngOnClientClick="document.getElementById('Form').target ='_blank';"
colincameron

Có, nó đã hoạt động với tôi nhưng nó đang mở trang vào tab mới không phải trong cửa sổ mới. Làm cách nào để mở trang của tôi trong một cửa sổ mới?
Shilpa Soni

61

Bạn có thể sử dụng điều này làm phương pháp mở rộng

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

Với điều này, bạn có thể ghi đè tốt lên đối tượng Phản hồi thực tế

Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");

1
những gì tôi phải gửi cho đối số đầu tiên?
Raghuveera,

Anh bạn, đây là giải pháp tuyệt vời thực sự hiệu quả! Cảm ơn bạn.
Klaus Nji

Giải pháp tái sử dụng tuyệt vời! Nhược điểm duy nhất là thực tế cửa sổ mới bị chặn bởi trình chặn cửa sổ bật lên.
MeanGreen

Đối số đầu tiên là đối tượng Phản hồi hiện tại của bạn.
Futureproof vào

Cảm ơn đã phản hồi!
Sasa Tancev 19/09/19

26

Vì Response.Redirect được khởi tạo trên máy chủ nên bạn không thể làm điều đó bằng cách sử dụng nó.

Nếu bạn có thể viết trực tiếp vào luồng Phản hồi, bạn có thể thử một số cách như:

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

3
Điều này hoạt động, nhưng sau đó trang nơi nút của tôi được thay đổi, giống như CSS hoặc DIVS đang bị ảnh hưởng.
Etienne

cửa sổ mới bật lên mỗi khi quay lại và quay lại.
devXen

26

Cấu trúc url của bạn thông qua trình xử lý sự kiện nhấp chuột:

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

Sau đó:

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

Trình chặn cửa sổ bật lên chặn url bất kỳ wa nào khác xung quanh điều này ??
Rafay

3
window.open trong ví dụ này sẽ luôn được coi là 'popup' vì nó được khởi tạo bằng mã chứ không phải hành động của người dùng. Nếu window.open được gọi khi người dùng nhấp vào một phần tử, phần tử đó sẽ bỏ qua hành động bật lên bị chặn bởi trình duyệt.
steve

@steve, Đây là một giải pháp tuyệt vời và rất đơn giản. Tôi đã sử dụng cách tiếp cận của bạn để Phản hồi. Chuyển hướng đến cửa sổ bật lên.
Sunil

14

Thủ thuật fixform rất gọn gàng, nhưng:

  1. Bạn có thể không có quyền truy cập vào mã của những gì tải trong cửa sổ mới.

  2. Ngay cả khi bạn làm như vậy, bạn đang phụ thuộc vào thực tế là nó luôn tải, không có lỗi.

  3. Và bạn phụ thuộc vào thực tế là người dùng sẽ không nhấp vào nút khác trước khi trang khác có cơ hội tải và chạy biểu mẫu sửa lỗi.

Tôi khuyên bạn nên làm điều này thay thế:

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

Và thiết lập biểu mẫu sửa chữa trên cùng một trang , giống như sau:

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

11

Bạn cũng có thể sử dụng mã phía sau như cách này

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

2
Điều này hoạt động tốt đối với tôi và về cơ bản là phiên bản ngắn của giải pháp Abhishek Shrivastava ở trên. Tuy nhiên, có một số lưu ý cần lưu ý. Đầu tiên, điều này sẽ kích hoạt trình chặn cửa sổ bật lên. Đặc biệt, nó sẽ hoàn toàn không hoạt động trong Safari 5.0 nếu trình chặn cửa sổ bật lên được bật vì Safari không nhắc bạn về các cửa sổ bật lên bị chặn và không cho phép bạn tạo ngoại lệ cho cửa sổ bật lên. Thứ hai, Chrome bỏ qua đối số trang thành window.open. Vì vậy, ngay cả khi bạn sử dụng window.open('page.aspx','_blank');nó vẫn mở nó trong một cửa sổ mới với thanh điều hướng bị vô hiệu hóa và thiếu các nút điều hướng thay vì một tab mới.
Kasey Speakman

8

Điều này không thể xảy ra với Response.Redirect vì nó xảy ra ở phía máy chủ và không thể hướng trình duyệt của bạn thực hiện hành động đó. Những gì sẽ được để lại trong cửa sổ ban đầu? Một trang trống?


8

phương thức bật lên sẽ đưa ra một câu hỏi an toàn cho khách truy cập ..

đây là giải pháp đơn giản của tôi: và hoạt động ở mọi nơi.

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

Tôi không thể chỉnh sửa bài đăng của bạn vì ít nhất không phải 6 ký tự, nhưng nó không phải là '("href")', đó là '["href"]'
Nickso


4

Nếu bạn có thể cấu trúc lại mã của mình để không cần gửi lại, thì bạn có thể sử dụng mã này trong sự kiện PreRender của nút:

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

4

Bạn cũng có thể sử dụng mã sau để mở trang mới trong tab mới.

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

Và chỉ cần gọi Response.Redirect ("yourPage.aspx"); sự kiện phía sau nút.


Phương pháp này kích hoạt cả OnClientClick cũng như onclick . Có nghĩa là một số trang được mở ra ở cửa sổ mới cũng như một số hành động đã được thực hiện trong cùng một trang
Manivannan Nagarajan

3

Tôi luôn sử dụng mã này ... Sử dụng mã này

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

Mã này sẽ không bao giờ ảnh hưởng đến lớp CSS nên cửa sổ mẹ sẽ không bị ảnh hưởng gì cả !!
Abhishek Shrivastava

1
Chà, đây chắc chắn là một lập luận mạnh mẽ cho MVC. Không lấy đi bất cứ thứ gì từ mã của bạn. Cách xa nó. Đó là những thứ như thế này định dạng các biểu mẫu web, tẩy trắng.
MrBoJangle

Tất cả mã này có thể được cô đọng thành một dòng ... hãy xem giải pháp của shalu bên dưới. Nó chính xác có tác dụng tương tự, nhưng không có tất cả các khối phồng không cần thiết.
Kasey Speakman

1

Đây là phiên bản jQuery dựa trên câu trả lời của @takrl và @tom ở trên. Lưu ý: không có formid được mã hóa cứng (có tên là aspnetForm ở trên) và cũng không sử dụng tham chiếu trực tiếp form.target mà Firefox có thể thấy có vấn đề:

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

Sau đó, trong tệp js của bạn được tham chiếu trên trang CÙNG:

function openNewWin () {
    $('form').attr('target','_blank');
    setTimeout('resetFormTarget()', 500);
}

function resetFormTarget(){
    $('form').attr('target','');
}

1

Tôi đã sử dụng Hyperlink thay vì LinkButton và nó hoạt động tốt, nó có thuộc tính Target nên đã giải quyết được vấn đề của tôi. Đã có giải pháp với Response.Write nhưng điều đó đang làm rối bố cục của tôi và giải pháp với ScriptManager, ở mỗi lần làm mới hoặc quay lại đang mở lại cửa sổ. Vì vậy, đây là cách tôi giải quyết nó:

<asp:HyperLink CssClass="hlk11" ID="hlkLink" runat="server" Text='<%# Eval("LinkText") %>' Visible='<%# !(bool)Eval("IsDocument") %>' Target="_blank" NavigateUrl='<%# Eval("WebAddress") %>'></asp:HyperLink>

0

Bạn có thể muốn sử dụng Page.RegisterStartupScript để đảm bảo rằng javascript kích hoạt khi tải trang.


0

bạn có thể mở cửa sổ mới từ mã asp.net bằng cách sử dụng ajax như tôi đã làm ở đây 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

Không có ví dụ nào trước đây phù hợp với tôi, vì vậy tôi quyết định đăng giải pháp của mình. Trong các sự kiện nhấp vào nút, đây là mã đằng sau.

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

Tôi đang phải sửa đổi mã response.redirect của người khác để mở trong một trình duyệt mới.


0

Tôi đã sử dụng phương pháp này, nó không yêu cầu bạn thực hiện bất kỳ điều gì trên cửa sổ bật lên (mà tôi không có quyền truy cập vì tôi đang chuyển hướng đến tệp PDF). Nó cũng sử dụng các lớp.

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

Để sử dụng, hãy thêm lớp "cửa sổ mới" vào bất kỳ phần tử nào. Bạn không cần thêm bất cứ thứ gì vào thẻ body. Chức năng này thiết lập cửa sổ mới và sửa chữa nó trong cùng một chức năng.


0

Tôi đã làm điều này bằng cách đặt target = "_ blank" vào nút liên kết

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

thì trong trang codebehind, chỉ cần đặt thuộc tính 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";}

VÀ mã phía sau:

Response.Redirect(URL); 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.