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





Это невозможно с Response.Redirect, поскольку это происходит на стороне сервера и не может указать вашему браузеру выполнить это действие. Что останется в начальном окне? Пустая страница?
Поскольку Response.Redirect инициируется на сервере, вы не можете сделать это с помощью этого.
Если вы можете писать прямо в поток ответов, вы можете попробовать что-то вроде:
response.write("<script>");
response.write("window.open('page.html','_blank')");
response.write("</script>");
новое окно всплывает каждый раз при переходе вперед и назад.
Вы можете использовать Page.RegisterStartupScript, чтобы гарантировать, что javascript срабатывает при загрузке страницы.
Я только что нашел ответ, и он работает :)
Вам необходимо добавить следующую ссылку / кнопку на стороне сервера:
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()">
Нет, поскольку здесь используется javascript для изменения цели формы. Вместо этого страница будет отправлена как обычно.
Кроме того, у вас может быть нарушение безопасности, если вы хотите перенаправить на страницу за пределами вашего виртуального каталога.
Как-то в моем случае это не работает. Я открываю ту же страницу в новом окне и пишу ответ на эту страницу. Но когда я сохраняю метод fixform () на главной странице, он выдает ошибку, говоря, что документ имеет значение null. Не уверен, почему это бросает все еще пытается найти решение. Хотя я придумал временное решение, используя onClientClick = "aspnetForm.target = '';" свойство для других кнопок на этой странице.
Я только что попробовал, и вместо OnClientClick = "aspnetForm.target ='_blank';" мне пришлось использовать OnClientClick = "document.getElementById('Form').target ='_blank';"
Да, у меня это сработало, но страница открывается в новой вкладке, а не в новом окне. Как я могу открыть свою страницу в новом окне?
@ShilpaSoni, который зависит от настроек браузера, вы ничего не можете сделать в коде, чтобы принудительно открыть новое окно вместо новой вкладки, за исключением использования модального окна или окна сообщения AFAIK.
Имя моей формы не было aspnetForm, поэтому мне нужно было проверить в Google Chrome Dev Tools идентификатор моей формы, затем я изменил его следующим образом: OnClientClick = "myform.target ='_blank';"
Вы можете избавиться от части "fixform", просто определив свою форму с помощью target = "_self", поэтому target = "_blank" переопределит только текущую страницу <form id = "aspnetForm" runat = "server" target = "_self">.
Вы также можете использовать в коде таким образом
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');, он все равно открывает его в новом окне с отключенной панелью навигации и отсутствующими кнопками навигации вместо новой вкладки.
Уловка с фиксацией формы проста, но:
Возможно, у вас нет доступа к коду того, что загружается в новом окне.
Даже если вы это сделаете, вы зависите от тот факт, что он всегда загружается, ошибка свободный.
И вы в зависимости от факта что пользователь не нажмет другой кнопку, прежде чем другая страница получит шанс загрузить и запустить fixform.
Я бы предложил сделать это вместо этого:
OnClientClick = "aspnetForm.target ='_blank';setTimeout('fixform()', 500);"
И настройте fixform на та же страница, как это:
function fixform() {
document.getElementById("aspnetForm").target = '';
}
Я всегда использую этот код ... Используйте этот код
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, поэтому на родительское окно это никак не повлияет !!
Что ж, это, безусловно, веский аргумент в пользу MVC. Ничего не убирать из кода. Отнюдь не. Такие вещи типичны для веб-форм, черт.
Весь этот код можно сжать до одной строки ... см. Решение shalu ниже. Это точно такой же эффект, но без ненужного раздувания.
вы можете открыть новое окно из кода 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);
}
Вы можете использовать это как метод расширения
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");
что я должен послать в качестве первого аргумента?
Чувак, это фантастическое решение, которое действительно работает! Спасибо.
Отличное многоразовое решение! Единственным недостатком является то, что новое окно блокируется блокировщиком всплывающих окон.
Первый аргумент - это ваш текущий объект Response.
Спасибо за отзыв!
<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 не определен.
Если вы можете реструктурировать свой код так, чтобы вам не требовалась обратная передача, то вы можете использовать этот код в событии PreRender кнопки:
protected void MyButton_OnPreRender(object sender, EventArgs e)
{
string URL = "~/MyPage.aspx";
URL = Page.ResolveClientUrl(URL);
MyButton.OnClientClick = "window.open('" + URL + "'); return false;";
}
Создайте свой URL-адрес с помощью обработчика события щелчка:
string strUrl = "/some/url/path" + myvar;
Потом:
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open('" + strUrl + "','_blank')", true);
Блокировщик всплывающих окон блокирует любой другой URL-адрес вокруг этого ??
window.open в этом примере всегда будет рассматриваться как «всплывающее окно», поскольку оно инициируется кодом, а не действием пользователя. если window.open вызывается, когда пользователь нажимает на элемент, это должно обойти заблокированное действие всплывающего окна браузера.
@steve, это отличное и очень простое решение. Я использовал ваш подход к Response.Redirect во всплывающем окне.
Вот версия jQuery, основанная на ответе @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','');
}
Я использовал Hyperlink вместо LinkButton, и он работал нормально, у него есть свойство 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>
Вы также можете использовать следующий код, чтобы открыть новую страницу в новой вкладке.
<asp:Button ID = "Button1" runat = "server" Text = "Go"
OnClientClick = "window.open('yourPage.aspx');return false;"
onclick = "Button3_Click" />
И просто вызовите Response.Redirect ("yourPage.aspx"); за событием кнопки.
Этот метод запускает как OnClientClick, так и по щелчку. Означает, что какая-то страница открыта в новом окне, а также какое-то действие было выполнено на той же странице
Ни один из предыдущих примеров у меня не работал, поэтому я решил опубликовать свое решение. В событиях нажатия кнопки вот код.
Dim URL As String = "http://www.google/?Search = " + txtExample.Text.ToString
URL = Page.ResolveClientUrl(URL)
btnSearch.OnClientClick = "window.open('" + URL + "'); return false;"
Мне пришлось изменить чужой код response.redirect, чтобы он открывался в новом браузере.
Я использовал этот подход, он не требует, чтобы вы что-либо делали во всплывающем окне (к которому у меня не было доступа, потому что я перенаправлял на файл 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 ничего добавлять не нужно. Эта функция устанавливает новое окно и исправляет его в той же функции.
popup предложит посетителю безопасный вопрос.
вот мое простое решение: и работаю везде.
<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"]'
Я сделал это, поместив 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)
HTML
<asp:Button ID = "Button1" runat = "server" Text = "Button" onclick = "Button1_Click" OnClientClick = "SetTarget();" />
Javascript:
function SetTarget() {
document.forms[0].target = "_blank";}
И код позади:
Response.Redirect(URL);
Это работает, но затем страница, на которой находится моя кнопка, изменяется, как CSS или DIVS.