2010-01-20 9 views
11

Oto, co próbuję zrobić w ASP.NET:Jak wyświetlać ASPX w innym dynamicznym DIV ASPX w środowisku wykonawczym?

Utwórz jedną stronę o nazwie Main.aspx. Ta strona ma DIV i przyciski.

Przeglądarka ładuje plik Main.aspx. Następnie, gdy kliknę przycisk, chcę załadować stronę Page99.aspx do DIV w Main.aspx dynamicznie, ale bez Main.aspx wymaga odświeżenia.

Tak, Main.aspx ładuje się raz, a następnie wszystkie treści wyświetlane w Main.aspx będą pochodzić z różnych stron .aspx.

Ps. Szukam rozwiązania jak wyżej, ale nie używając ramek.

UPDATE 1 Należy wspomnieć, że Page99 nie jest prostą stroną HTML. Będzie zawierać kontrolki internetowe.

+0

Ktoś miał dobrą odpowiedź na temat korzystania z klasy przodków, ale niestety wydaje się, że został usunięty. Czy ta osoba może przywrócić odpowiedź? – Liao

Odpowiedz

4

O ile mi wiadomo, z wyjątkiem stosowania ramek iframe, nie ma możliwości załadowania jednej strony aspx do drugiej.

Z postbacks lub ajax, możesz użyć UserControls (ascx). Mogą one zawierać prawie taką samą treść, jaką strona może lub mimo to użyć strony MasterPage.

Jeśli nie chcesz otrzymywać postbacków, to prawdopodobnie jest to metoda ajaxowa, ale znowu nie pozwala ona załadować strony aspx do innej, tylko w celu zmiany zawartości strony, na której się znajdujesz (pośród inne rzeczy).

Nie jestem pewien co do innych platform do tworzenia stron internetowych, ale mogą one mieć rozwiązanie bliższe temu, co chcesz zrobić, więc jeśli asp.net nie jest "koniecznością", powinieneś rozważyć sprawdzenie innych platform.

+0

Zatem, jeśli zamiast tego Page99 jest kontrolą użytkownika, to "osadzanie" można wykonać w środowisku wykonawczym po kliknięciu przycisku za pomocą AJAX? [Czy możesz wskazać mi przykłady, o których wiesz, ponieważ nie mogłem znaleźć żadnych konkretnych informacji na ten temat (znalazłem informacje na temat włączeń, ale to nie zadziała w moim przypadku). – Liao

+0

@Liao - Powinieneś przeczytaj o UpdatePanel: http://www.asp.net/Ajax/Documentation/Live/overview/UpdatePanelOverview.aspx – SirDemon

+0

Czytałem trochę o tym, ale niewiele; zrobi więcej czytania na ten temat (w niektórych przypadkach jest powolny). – Liao

6

Jeśli nie chcesz korzystać z iframe, można bardzo dobrze wykorzystać elementu obiektu HTML. Śledź tutaj, aby zobaczyć i przykład html. bardzo dobrze można to wykorzystać dla aspx również pewne zmiany, jak przy użyciu OnClientClick nieruchomości na przycisk aspx itp

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

To świetnie i super proste! Na marginesie, kiedy rzeczy mają proste rozwiązanie, czasami zastanawiasz się "czy to może być takie proste!". Czy w tym podejściu są jakieś pułapki/zastrzeżenia? – Liao

+0

Jednym z prawdopodobnych pułapek w tym podejściu (jeśli twoja strona wewnętrzna to rzeczywiście aspx) jest to, że twoja stan wyświetlania i posty z dwiema stronami mogą być ze sobą w konflikcie, chociaż istnieją obejścia. –

+0

Ogólnie podejście HTML nie działa. W moim przypadku nie można renderować adresu URL raportu. Wydaje mi się, że jest to kwestia cross-scripting, ALE działa, gdy uzyskuje się dostęp przez konto administratora, przez które strony były hostowane w IIS. Stoję w obliczu tego, muszę iść z innym podejściem. –

0

Myślę, że można to zrobić za pomocą AJAX i sposobu WWW na serwerze.

Przycisk (i) na stronie wywołuje metodę sieciową przy użyciu AJAX, z różnymi argumentami dla poprawnej strony do załadowania do DIV. Metoda internetowa ładuje prawidłową stronę przy użyciu zwykłego żądania internetowego.

Np

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

Następnie metoda zwróci HTML wygenerowany przez plik ASPX z powrotem do klienta. Gdy klient otrzymuje wywołanie zwrotne, może odszyfrować kod HTML i umieścić go w elemencie div.

Np

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

Myślę, że to może zadziałać; ale podejrzewam, że podejście to nie zadziała, jeśli ma na nim kontrole internetowe. Czy mam rację? – Liao

+1

Koniec końców próbuje wstawić wiele tagów HTML, ciała i głowy na stronie. Pole widoku będzie również powielone, więc wysyłanie z powrotem prawdopodobnie już nie będzie działało, a jak poprawnie wskażesz, a kontrola na stronie 99 (jeśli to zadziała) spowoduje, że cała strona będzie odświeżana, a niezbędne informacje o odesłaniu z pewnością nie będą jest przekierowywany z powrotem na stronę 99, ale zamiast tego kończy się na stronie nadrzędnej (prawdopodobnie powodując, że "Drzewo kontrolne, do którego ładowana jest datastate, musi być zgodne z drzewem kontrolnym, które było używane do zachowania stanu wyświetlania podczas poprzedniego żądania") –

+0

@Martin, bardzo dobre punkty. Założyłem na podstawie braku ramek, że strony "dzieci" miały być dość proste. Od tego czasu pytanie zostało zaktualizowane. – Coxy

1

Jeśli używasz zestawu narzędzi AJAX, powinno być możliwe, aby to zrobić za pomocą WebControl zamiast strony aspx.

Jeśli spróbujesz zastosować ten pomysł na stronach ASPX i bez użycia elementu iframe, okaże się, że nie ma izolacji dla nazw zmiennych javascript i identyfikatorów elementów, dlatego prawie gwarantujesz konflikty, jeśli umieścisz renderowane treści aspx w div używający innerHTML; Strona z pewnością nie będzie w stanie wykonać częściowego odświeżenia, jak sobie wyobrażam.

Zamiast tego użyj narzędzia webcontrol: lepszym rozwiązaniem byłoby zainstalowanie zestawu narzędzi AJAX, jeśli jeszcze tego nie zrobiłeś, i użycie kontrolki updatepanel. Dynamicznie ładuj i usuwaj kontrolki internetowe wewnątrz tego panelu (za pomocą LoadControl()) lub umieść w nim kontrolkę Multiview i zmieniaj widok aktywny, aby symulować zmianę tej zawartości.

Aktualizator umożliwia aktualizację jego zawartości bez pełnego odświeżenia strony (odświeżenie strony).