2010-01-20 3 views
11

Hier ist, was ich versuche, in ASP.NET zu tun:Wie wird eine ASPX in einem anderen ASPX DIV dynamisch zur Laufzeit angezeigt?

Erstellen Sie eine Seite namens Main.aspx. Diese Seite hat einen DIV und eine Taste.

Der Browser lädt Main.aspx. Wenn ich dann auf den Button klicke, möchte ich die Seite Page99.aspx dynamisch in das DIV in Main.aspx laden, aber ohne Main.aspx, das ein Postback erfordert.

So wird Main.aspx einmal geladen und danach alle Inhalte in Main.aspx angezeigt werden von verschiedenen ASPX-Seiten kommen.

Ps. Ich suche nach einer Lösung wie oben, aber nicht mit Frames.

UPDATE 1 Ich sollte erwähnen, dass Page99 ist keine einfache HTML-Seite. Es enthält Web-Steuerelemente.

+0

Jemand hatte eine nette Antwort über die Verwendung einer Vorfahrenklasse, aber leider scheint es gelöscht worden zu sein. Kann diese Person die Antwort zurückbringen? – Liao

Antwort

4

Soweit ich weiß, gibt es keine Möglichkeit, eine Aspx-Seite in eine andere zu laden, abgesehen von der Verwendung von iframes.

Mit Postbacks oder Ajax können Sie stattdessen UserControls (ascx) verwenden. Sie können ziemlich genau den Inhalt einer Seite enthalten oder eine MasterPage verwenden.

Wenn Sie keine Postbacks haben wollen, ist Ajax wahrscheinlich der Weg zu gehen, obwohl es wieder nicht erlaubt, eine aspx Seite in eine andere zu laden, nur um den Inhalt der Seite zu ändern, auf der Sie sich befinden andere Dinge).

Ich bin mir nicht sicher über andere Plattformen für Web-Entwicklung, sie haben vielleicht eine Lösung näher an dem, was Sie tun möchten, also wenn asp.net kein "Muss" ist, sollten Sie prüfen, andere Plattformen auschecken.

+0

Also, wenn Page99 ist stattdessen ein Benutzer Control, kann diese "Einbettung" zur Laufzeit erfolgen, wenn der Button mit AJAX geklickt wird? [Könntest du mich auf einige Beispiele hinweisen, die du kennst, weil ich keine spezifischen Informationen darüber gefunden habe (Infos über Includes gefunden, aber das wird in meinem Fall nicht funktionieren).] – Liao

+0

@Liao - Du solltest Lies etwas über UpdatePanel: http://www.asp.net/Ajax/Documentation/Live/overview/UpdatePanelOverview.aspx – SirDemon

+0

Ich lese ein wenig darüber, aber nicht viel; werde mehr darüber lesen (in manchen Fällen ist es langsam). – Liao

6

Wenn Sie die iFrames nicht verwenden möchten, können Sie sehr gut Object-Element von HTML verwenden. Folgen Sie hier, um zu sehen und HTML-Beispiel. Sie können das sehr gut auch mit etwas ändern, wie mit OnClientClick Eigenschaft für aspx Taste usw.

<!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

Das ist großartig und super einfach! Abgesehen davon, wenn die Dinge eine einfache Lösung haben, fragen Sie sich manchmal, "könnte es so einfach sein!". Gibt es irgendwelche Fallstricke, die Sie bei diesem Ansatz denken können? – Liao

+0

Eine wahrscheinliche Gefahr bei diesem Ansatz (wenn Ihre innere Seite tatsächlich aspx ist) besteht darin, dass Ihre ViewState und Postbacks mit den beiden Seiten miteinander in Konflikt geraten können, obwohl es Umgehungslösungen gibt. –

+0

Im Allgemeinen funktioniert HTML-Ansatz nicht. In meinem Fall kann die Berichts-URL nicht gerendert werden. Es scheint mir ein Cross-Scripting-Problem zu sein, ABER es funktioniert, wenn ich über ein Admin-Konto über die Seiten in IIS gehostet habe. Ich stehe vor diesem, muss mit einem anderen Ansatz gehen. –

0

für aspx verwende ich denken würde, dass Sie diese mit AJAX tun könnte, und eine Web-Methode auf dem Server.

Die Schaltfläche (n) auf der Seite ruft die Webmethode auf, die AJAX mit verschiedenen Argumenten für das Laden der richtigen Seite in dem DIV verwendet. Die Web-Methode lädt die richtige Seite mit einer normalen Web-Anfrage.

ZB:

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

Dann wird das Verfahren würde die HTML-Datei durch die ASPX erzeugt wieder zurück an den Client. Wenn der Client den Rückruf erhält, kann er den HTML-Code entschlüsseln und in das div einfügen.

ZB:

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

Ich denke, das könnte funktionieren; aber ich nehme an, der Ansatz wird nicht funktionieren, wenn Page99 Web-Controls darauf hatte. Habe ich recht? – Liao

+1

Sie würden am Ende versuchen, mehrere HTML-, Körper-und Kopf-Tags in die Seite einzufügen. Das Viewstate-Feld würde ebenfalls dupliziert werden, so dass das Zurücksetzen wahrscheinlich nicht mehr funktioniert, und wie Sie richtig angeben, würde die Kontrolle auf Page99 (wenn es funktioniert) dazu führen, dass die gesamte Seite postbackt und die notwendigen Postback-Informationen sicher nicht erhalten würden zurückgeleitet zu page99, aber stattdessen mit der übergeordneten Seite enden würde (was wahrscheinlich zu einem "Die Steuer-Struktur, in die viewstate geladen wird, muss mit der Steuer-Struktur, die zum Speichern von viewstate während der vorherigen Anfrage verwendet wurde" Fehler) –

+0

@Martin, sehr gute Punkte. Ich hatte aufgrund der fehlenden Frames angenommen, dass die "Kinder" -Seiten ziemlich einfach sein sollten. Die Frage wurde seitdem aktualisiert. – Coxy

1

Wenn Sie den AJAX-Toolkit verwenden, sollte es möglich sein, dies zu tun, um eine webcontrol anstatt eine ASPX-Seite verwenden.

Wenn Sie versuchen, diese Idee mit ASPX-Seiten und ohne Verwendung eines iframe zu verfolgen, werden Sie keine Isolation für Javascript-Variablennamen und Element-IDs finden, wodurch Konflikte fast garantiert werden, wenn Sie den Inhalt des gerenderten Aspx eingeben ein div, das innerHTML verwendet; Die Seite wird definitiv nicht in der Lage sein, ein teilweises Postback durchzuführen, wie ich es mir vorstelle.

Verwenden Sie stattdessen ein webcontrol: Eine bessere Lösung wäre, das AJAX-Toolkit zu installieren, falls Sie dies noch nicht getan haben, und ein updatepanel-Steuerelement zu verwenden. Laden oder entlasten Sie webcontrols in diesem Bereich dynamisch (mithilfe von LoadControl()), oder platzieren Sie ein Multiview-Steuerelement darin und ändern Sie activeview, um das Ändern dieses Inhalts zu simulieren.

Das Updatepanel ermöglicht die Aktualisierung des Inhalts ohne vollständigen Postback (Seitenaktualisierung).