c# - pestaña - Respuesta.Redirecto a una nueva ventana
llamar a otra pagina asp net c# (20)
Quiero hacer un Response.Redirect("MyPage.aspx")
pero lo tengo abierto en una nueva ventana del navegador. He hecho esto antes sin usar el método de script de registro de JavaScript. Simplemente no puedo recordar cómo?
Acabo de encontrar la respuesta y funciona :)
Debe agregar lo siguiente a su enlace / botón del servidor:
OnClientClick="aspnetForm.target =''_blank'';"
Todo el código de mi botón tiene el siguiente aspecto:
<asp:LinkButton ID="myButton" runat="server" Text="Click Me!"
OnClick="myButton_Click"
OnClientClick="aspnetForm.target =''_blank'';"/>
En el lado del servidor OnClick hago un Response.Redirect("MyPage.aspx");
y la página se abre en una nueva ventana.
La otra parte que necesita agregar es arreglar el destino del formulario; de lo contrario, cada enlace se abrirá en una nueva ventana. Para hacerlo, agregue lo siguiente en el encabezado de su ventana 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>
y
<body onload="fixform()">
Aquí hay una versión de jQuery basada en la respuesta de @takrl y @tom anterior. Nota: no hay formid codificado (llamado aspnetForm arriba) y tampoco usa referencias directas de form.target que Firefox puede encontrar problemáticas:
<asp:Button ID="btnSubmit" OnClientClick="openNewWin();" Text="Submit" OnClick="btn_OnClick" runat="server"/>
Luego en su archivo js referenciado en la MISMA página:
function openNewWin () {
$(''form'').attr(''target'',''_blank'');
setTimeout(''resetFormTarget()'', 500);
}
function resetFormTarget(){
$(''form'').attr(''target'','''');
}
Como Response.Redirect se inicia en el servidor, no puede hacerlo utilizando eso.
Si puede escribir directamente en la secuencia de respuesta, puede intentar algo como:
response.write("<script>");
response.write("window.open(''page.html'',''_blank'')");
response.write("</script>");
Construya su url mediante el controlador de eventos click:
string strUrl = "/some/url/path" + myvar;
Entonces:
ScriptManager.RegisterStartupScript(Page, Page.GetType(), "popup", "window.open(''" + strUrl + "'',''_blank'')", true);
El método emergente le dará una pregunta segura al visitante.
aquí está mi solución simple: y trabajando en todas partes.
<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();"/>
El truco de Fixform es limpio, pero:
Es posible que no tenga acceso al código de lo que se carga en la nueva ventana.
Incluso si lo hace, depende del hecho de que siempre se carga, sin errores.
Y depende del hecho de que el usuario no haga clic en otro botón antes de que la otra página tenga la oportunidad de cargar y ejecutar el formulario.
Sugeriría hacer esto en su lugar:
OnClientClick="aspnetForm.target =''_blank'';setTimeout(''fixform()'', 500);"
Y configure fixform en la misma página , con el siguiente aspecto:
function fixform() {
document.getElementById("aspnetForm").target = '''';
}
Es posible que desee utilizar Page.RegisterStartupScript para asegurarse de que se active el javascript en la página.
Esto no es posible con Response.Redirect, ya que ocurre en el lado del servidor y no puede dirigir su navegador para que realice esa acción. ¿Qué quedaría en la ventana inicial? Una página en blanco?
HTML
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" OnClientClick = "SetTarget();" />
Javascript:
function SetTarget() {
document.forms[0].target = "_blank";}
Y codebehind:
Response.Redirect(URL);
Hice esto poniendo target = "_ blank" en el botón de enlace
<asp:LinkButton ID="btn" runat="server" CausesValidation="false" Text="Print" Visible="false" target="_blank" />
luego, en la página de código subyacente simplemente configura el atributo href:
btn.Attributes("href") = String.Format(ResolveUrl("~/") + "test/TestForm.aspx?formId={0}", formId)
Ninguno de los ejemplos anteriores funcionó para mí, así que decidí publicar mi solución. En el botón haga clic en eventos, aquí está el código detrás.
Dim URL As String = "http://www.google/?Search=" + txtExample.Text.ToString
URL = Page.ResolveClientUrl(URL)
btnSearch.OnClientClick = "window.open(''" + URL + "''); return false;"
Tenía que modificar la respuesta de otra persona. Código directo para abrir en un nuevo navegador.
Puedes usar esto como método de extensión
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);
}
}
}
Con esto obtienes una buena anulación en el objeto de respuesta real
Response.Redirect(redirectURL, "_blank", "menubar=0,scrollbars=1,width=780,height=900,top=10");
Si puede volver a estructurar su código para que no necesite devolverlo, puede usar este código en el evento PreRender del botón:
protected void MyButton_OnPreRender(object sender, EventArgs e)
{
string URL = "~/MyPage.aspx";
URL = Page.ResolveClientUrl(URL);
MyButton.OnClientClick = "window.open(''" + URL + "''); return false;";
}
Siempre uso este código ... Use este código
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 ());
}
También puede usar el siguiente código para abrir una página nueva en una pestaña nueva.
<asp:Button ID="Button1" runat="server" Text="Go"
OnClientClick="window.open(''yourPage.aspx'');return false;"
onclick="Button3_Click" />
Y simplemente llame a Response.Redirect ("yourPage.aspx"); detrás del evento del botón.
También puedes usar el código detrás de esta manera
ClientScript.RegisterStartupScript(this.Page.GetType(), "",
"window.open(''page.aspx'',''Graph'',''height=400,width=500'');", true);
Usé Hyperlink en lugar de LinkButton y funcionó bien, tiene la propiedad Target por lo que resolvió mi problema. Estaba la solución con Response.Write, pero eso estaba estropeando mi diseño, y el que tenía ScriptManager, en cada actualización o respaldo, volvía a abrir la ventana. Así que así es como lo resolví:
<asp:HyperLink CssClass="hlk11" ID="hlkLink" runat="server" Text=''<%# Eval("LinkText") %>'' Visible=''<%# !(bool)Eval("IsDocument") %>'' Target="_blank" NavigateUrl=''<%# Eval("WebAddress") %>''></asp:HyperLink>
Usé este enfoque, no requiere que hagas nada en la ventana emergente (a la que no tuve acceso porque estaba redireccionando a un archivo PDF). También usa clases.
$(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);
});
});
Para usar, agrega la clase "nueva ventana" a cualquier elemento. No necesita agregar nada a la etiqueta corporal. Esta función configura la nueva ventana y la arregla en la misma función.
puedes abrir una nueva ventana desde el código asp.net detrás de usar ajax como hice aquí 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);
}
<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");
}
Fuente: http://dotnetchris.wordpress.com/2008/11/04/c-aspnet-responseredirect-open-into-new-window/