2010-01-20 38 views
11

Esto es lo que estoy tratando de hacer en ASP.NET:¿Cómo mostrar un ASPX en otro DIV de ASPX dinámicamente en tiempo de ejecución?

Cree una página llamada Main.aspx. Esta página tiene un DIV y un botones.

El navegador carga Main.aspx. Luego, cuando hago clic en el botón, quiero cargar la página Page99.aspx en el DIV en Main.aspx dinámicamente, pero sin Main.aspx que requiera una devolución de datos.

Por lo tanto, Main.aspx se carga una vez y, a continuación, todo el contenido que se muestra en Main.aspx vendrá de diferentes páginas .aspx.

Ps. Estoy buscando una solución como la anterior, pero no usando marcos.

ACTUALIZACIÓN 1 Debo mencionar que Page99 no es una página HTML simple. Contendrá controles web.

+0

Alguien ha tenido una buena respuesta sobre el uso de una clase antepasado, pero lamentablemente parece que se ha eliminado. ¿Puede esa persona traer la respuesta? – Liao

Respuesta

4

Hasta donde yo sé, salvo el uso de iframes, no hay forma de cargar una página aspx en otra.

Con las devoluciones de datos o ajax, puede utilizar UserControls (ascx) en su lugar. Pueden contener prácticamente el mismo contenido que una página de todos modos, o usar una página maestra.

Si no desea tener devoluciones, ajax es probablemente el camino a seguir, aunque nuevamente, no le permite cargar una página aspx en otra, solo para cambiar el contenido de la página en la que se encuentra (entre otras cosas). No estoy seguro acerca de otras plataformas para desarrollo web, pueden tener una solución más cercana a lo que quiere hacer, por lo que si asp.net no es "obligatorio", debería considerar visitar otras plataformas.

+0

Entonces, si Page99 es en cambio un Control de usuario, ¿esta "incrustación" se puede realizar en tiempo de ejecución cuando se hace clic en el Botón utilizando AJAX? [¿Podría indicarme algunos ejemplos que conoce, porque no he podido encontrar ninguna información específica sobre cómo hacerlo? (Encontré información sobre includes, pero eso no va a funcionar en mi caso).] – Liao

+0

@Liao - Debería Lea sobre UpdatePanel: http://www.asp.net/Ajax/Documentation/Live/overview/UpdatePanelOverview.aspx – SirDemon

+0

Leí un poco sobre esto, pero no mucho; Haré más lectura sobre eso (aparentemente es lento en algunos casos). – Liao

6

Si no desea utilizar los iFrames, que muy bien puede utilizar el elemento objeto de HTML. Siga aquí para ver y ejemplo html. Se puede utilizar muy bien para este aspx también con algún cambio, como el uso de la propiedad para OnClientClick botón aspx etc.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<title>mouseover image position</title> 
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" /> 

<style type="text/css"> 
/*<![CDATA[*/ 
body 
    { 
    background-color:#aaaaff; 
    } 
#one 
    { 
    position:absolute; 
    left:50%; 
    top:50%; 
    margin:-150px 0 0 -250px; 
    } 
object 
    { 
    width:500px; 
    height:300px; 
    border:solid 1px #000000; 
    } 
/*//]]>*/ 
</style> 

<script type="text/javascript"> 
//<![CDATA[ 
// written by: Coothead 
function updateObjectIframe(which){ 
    document.getElementById('one').innerHTML = '<'+'object id="foo" name="foo" type="text/html" data="'+which.href+'"><\/object>'; 
} 

//]]> 
</script> 

</head> 
<body> 

<div id="one"> 
<object id="foo" name="foo" type="text/html" data="http://www.w3schools.com/"></object> 
</div> 
<div> 
<a href="http://www.google.com" onclick="updateObjectIframe(this); return false;">this is an object test not an iframe test</a> 
</div> 

</body> 
</html> 
+0

¡Eso es genial y súper simple! Por otro lado, cuando las cosas tienen una solución simple, en algún momento te preguntas "¡podría ser tan fácil!". ¿Hay alguna trampa/advertencias que pueda pensar en este enfoque? – Liao

+0

Una posible trampa con este enfoque (si su página interna es de hecho aspx) es que su viewState y las devoluciones de datos con las dos páginas podrían entrar en conflicto entre sí, aunque existen soluciones provisionales. –

+0

En general, el enfoque HTML no funciona. En mi caso, no puede mostrar la URL del informe. Es un problema de scripts cruzados, pero funciona cuando se accede a través de la cuenta de administrador a través de las páginas alojadas en IIS. Me enfrento a esto, necesito ir con otro enfoque. –

0

Me gustaría pensar que usted puede hacer esto utilizando AJAX y un método web en el servidor.

El botón (o botones) de la página llama al método web utilizando AJAX, con varios argumentos para cargar la página correcta en el DIV. El método web carga la página correcta utilizando una solicitud web normal.

Ej:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://servername/filename.aspx"); 
WebResponse response = request.GetResponse(); 

A continuación, el método podría devolver el HTML generado por el archivo ASPX de vuelta al cliente. Cuando el cliente recibe la devolución de llamada, puede descodificar el HTML y colocarlo en el div.

Ej:

var startOfHTML = response.indexOf('&lt;'); 
var endOfHTML = response.indexOf('</string>'); 

response = response.substring(startOfHTML, endOfHTML); 
response = response.replace(/&lt;/g, "<"); 
response = response.replace(/&gt;/g, ">"); 

var div = document.getElementById("myDIV"); 
div.innerHTML = response; 
+0

Supongo que podría funcionar; pero supongo que el enfoque no funcionará si Page99 tuviera controles web sobre él. ¿Estoy en lo cierto? – Liao

+1

Usted terminaría tratando de insertar múltiples etiquetas html, cuerpo y cabeza en la página. El campo viewstate también se duplicaría, por lo que publicarlo probablemente ya no funcionaría, y como usted señala correctamente, y el control en Page99 (si funciona) provocaría que la página completa se devuelva, y la información de devolución necesaria no se obtendría enrutado de nuevo a la página 99, pero en su lugar terminaría en la página principal (probablemente provocando un error "El árbol de control en el que ViewState se está cargando debe coincidir con el árbol de control que se usó para guardar viewview durante la solicitud anterior" –

+0

@Martin, muy buenos puntos. Asumí, debido a la falta de marcos, que las páginas 'para niños' serían bastante básicas. La pregunta se ha actualizado desde entonces. – Coxy

1

Si está usando el kit de herramientas AJAX, debería ser posible hacer esto utilizando una de webcontrol en lugar de una página ASPX.

Si intenta buscar esta idea utilizando páginas ASPX y sin utilizar un iframe, encontrará que no hay aislamiento para los nombres de las variables javascript y los identificadores de elementos, por lo que casi garantiza conflictos si coloca el contenido renderizado de aspx en un div usando innerHTML; La página definitivamente no podrá realizar una devolución de datos parcial como me imagino que le gustaría.

Uso de un control web en su lugar: una mejor solución sería instalar el kit de herramientas AJAX si aún no lo ha hecho, y utilizar un control de panel de actualización. Cargue y descargue dinámicamente controles web dentro de este panel (usando LoadControl()), o coloque un control Multiview dentro de él y cambie la vista activa para simular el cambio de este contenido.

Updatepanel permitirá que su contenido se actualice sin una devolución de datos completa (actualización de página).

Cuestiones relacionadas