Laden...

Updatepaneöl rendert die ganze Seite

Erstellt von schuppsl vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.750 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren
Updatepaneöl rendert die ganze Seite

Hello Leute.

Hätte da mal wieder ein Problemchen.

In Meiner Anwendung habe ich eine Seite, welche einige Daten an ein Hardwareterminal sendet.
Also Footer habe ich ein Updatepanel, welches die Uhrzeit anzeigt und alle 20 Sekunden aktualisiert wird.
Funktioniert so weit.

Nur wird jedes Mal die ganze Seite gerendert, was bedeutet, daß die Daten alle 20 Sekunden an das Terminal geschickt werden, was natürlich nicht sein soll.

Der Datenabgleich passiert im OnLoad Ereignis, wenn IsPostback true ist.
Und da liegt auch das Problem:

Das Updatepanel wird per Timer aktualisiert, welches alle 20 Sekunden einen Postback auslöst und somit die Datenkommunikation anstößt.

Warum ist das so?

H
222 Beiträge seit 2010
vor 13 Jahren

das onload-ereignis wird bei jeder aktion (klick auf button etc.) ausgelöst.
was hälst du denn davon die zeit mittels einem javascript zu aktualisieren???

mfg hurby

Die Welt hat genug für jedermanns Bedürfnisse, aber nicht für jedermanns Gier.

1.433 Beiträge seit 2006
vor 13 Jahren

Du könntest auch ohne UpdatePanel arbeiten.

Die Uhrzeit kannst Du mit einer Asynchronen WebMethod anzeigen lassen und dass senden der Daten alle 20 Sekunden genau gleich, dann hast Du gar keinen PostBack. Ich habe mal was realisiert was alle 5 Sekunden in einem GridView einen Status abfragt.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Aber ich dachte genau dafür ist ein UpdatePanel da?

Die Uhrzeit kommt von einem Socket vom Server, es ist nicht die lokale Zeit.

kannst Du mir das mit der asynchronen Webmethode etwas näher erklären?

1.433 Beiträge seit 2006
vor 13 Jahren

Ich hatte mal eine Diskussion hier im Forum von pro und contra zum AjaxControl Toolkit. Generell werden immer sehr viele dynamische Scrpts erzeugt, die Performance beeinflussend sein kann und daher habe ich wohl mit dem Toolkit am programmieren, brauche aber die UpdatePanels nicht.

1.) Erstelle Dir eine statische Methode im Codebehind mit dem Attribute WebMethod
2.) Im ScriptManager musst Du das Property EnablePageMethods="true" setzen
3.) Im oben erwähnten Blogbeitrag mache ich nicht's anderes.

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Also mir ist überhaupt nicht klar, was dieser Blogeintrag mit meinem Problem zu tun haben könnte... 🤔

1.433 Beiträge seit 2006
vor 13 Jahren

Also mir ist überhaupt nicht klar, was dieser Blogeintrag mit meinem Problem zu tun haben könnte...

  1. Soll er Dir zeigen dass es auch ohne Postback geht
  2. Ohne UpdatePanel und daher die Seite schlanker ist
  3. Das der Timer auch selber implementiert werden kann

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Aber wenn ich das nicht mit einem UpdatePanel mache, dann wird eben die ganze Seite neu geladen, genau das was ich ja verhindern möchte.
Wenn ich also nur einen Teil der Seite aktualisieren möchte, komme ich um Ajax/Updatepanel nicht herum, oder liege ich nun gänzlich falsch?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo schuppsl,

Du liegst nur halb daneben: um Ajax kommst Du nicht drumherum, um das UpdatePanel schon.
Das UpdatePanel hat den Nachteil, daß der Lifecycle der Seite (inklusive Page_Load) ausgeführt wird. Das willst Du ja eben verhindern. Deshalb der Hinweis von schaedld auf WebMethodAttribute und EnablePageMethods, damit geht's auch ohne Page_Load. Sieh Dir mal die Doku zu den fett markierten Begriffen an.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

1.433 Beiträge seit 2006
vor 13 Jahren

Hallo schuppsl,

Du liegst nur halb daneben: um Ajax kommst Du nicht drumherum, um das UpdatePanel schon.
Das UpdatePanel hat den Nachteil, daß der Lifecycle der Seite (inklusive Page_Load) ausgeführt wird. Das willst Du ja eben verhindern. Deshalb der Hinweis von schaedld auf WebMethodAttribute und EnablePageMethods, damit geht's auch ohne Page_Load. Sieh Dir mal die Doku zu den fett markierten Begriffen an.

Gruß, MarsStein

Danke @MarsStein für den Hinweis, vielleicht habe ich mich auch unglücklich ausgedrückt...

Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Hallo MarsStein, danke für die Hinweise ich kämpfe mich gerade durch, auch durch den BlogEintrag von schaedld.

Habe auch das hier gefunden,bekomme beim Ausführen aber immer die Meldung, daß PageMethods nicht definiert ist (befindet sich in der MasterPage), obwohl ich im Scriptmanager EnablePageMethods auf true gesetzt habe.

EDIT:
Also auf einer normalen asxp Seite geht es, aber warum auf einer Masterpage nicht?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

sind die Methoden, die Du mit dem [WebMethod] versehen hast, auch static?

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Hi, ja sind static.
Aber kann es sein, daß dies in einer Masterpage nicht funktioniert?
Bei einer normalen ASPX Seite gehts nämlich...

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

hatte nicht gesehen daß es sich um eine Masterpage handelt.
Der ScriptManager kann wohl in der Masterpage bleiben. Die eigentliche PageMethod muss aber in der Page liegen.
Wenn Du das mehrfach für verschiedene Seiten brauchst, die die Masterpage benutzen, kannst Du die statische Methode in der MasterPage ja behalten, allerdings ohne das Attribut.
Jede Seite die die Funktionalität braucht müsste dann eine PageMethod bekommen, die lediglich die Methode der Masterpage aufruft.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Ok, aber die eigentliche Frage ist ja: Wie kann ich dann partiell die Seite aktualisieren **ohne **Updatepanel?

Gerade das Updatepanel ist ja das praktische daran...sonst müsste ich ja die AJAX Requests wieder per Hand einfügen oder wie kann ich das machen?

Ich möchte ja im Footer der Seite eine Ampel einbauen, welche den Verbindungsstatus zu einem Programm (per Socket) darstellt.
Grün bedeutet verbunden, rot nicht verbunden.
Das funktioniert eben bereits mit Updatepanels, birgt aber die besagten Probleme mit sich.

Ich könnte also per Javascript einen Timer starten der alle 20 Sekunden die Webmethod abruft, welche wiederum den Status zum Socket prüft.
Je nach Status soll dann die grüne Ampel oder die rote Ampel angezeigt werden.
Per Updatepanel ist mir das klar, da wird ein Ajax Request erzeugt, welchen ich ja nun wohl selbst erzeugen muss?

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

schau Dir nochmal den Link von schaedld an: Du kannst in der PageMethod auch einen Wert zurückgeben.
Die Aktualisierung müsstest Du dann je nach Ergebnis der Methode im onSucceeded selbst vornehmen.

Btw: man kann auch in der PageMethod einen String zurückliefern, der ein fertiges Javascript enthält, und dieses dann clientseitig in der onSucceeded-Methode dynamisch in die Seite einbinden und damit zur Ausführung bringen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 13 Jahren

Also ich machs nun einfach so, daß ich ein asp:label Control habe, welches ich per Javascript verändere:

function onComplete(result)
{
document.getElementById("testZeitLabel").innerHTML= result;

}  

In der Webmethod kann ich nun Serverseitig tun und lassen was ich will, sprich die Verbindung testen und dann ein entsprechendes Bildchen anzeigen lassen.

Im Falle einer Sekundengenauen Uhrzeit vom Server sieht das Ganze dann so aus:


<script type="text/javascript">
  function loadHelloWorld()
    {
       rowId = setInterval(function() {
         PageMethods.HelloWorld("", onComplete);
       },1000);
     
    }
    
    function onComplete(result)
    {
    document.getElementById("testZeitLabel").innerHTML= result;
        
    }   
    </script>

Und im Code Behind Teil:


 [WebMethod]
        public static string HelloWorld(string name)
        {
            return DateTime.Now.ToString();

        }

DAS ist die Lösung, mit den Bildchen gehts auch schon...

Vielen Dank an schaedld und MarsStein für die Hilfe!