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?
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:
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>
và
<body onload="fixform()">
OnClientClick="aspnetForm.target ='_blank';"
tôi phải sử dụngOnClientClick="document.getElementById('Form').target ='_blank';"
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");
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>");
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);
Thủ thuật fixform rất gọn gàng, nhưng:
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.
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.
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 = '';
}
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);
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.
Đ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?
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();"/>
<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");
}
Nguồn: http://dotnetchris.wordpress.com/2008/11/04/c-aspnet-responseredirect-open-into-new-window/
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;";
}
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.
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 ());
}
Đâ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','');
}
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>
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);
}
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.
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.
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)
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);