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?
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.
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
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?
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
Also mir ist überhaupt nicht klar, was dieser Blogeintrag mit meinem Problem zu tun haben könnte... 🤔
Also mir ist überhaupt nicht klar, was dieser Blogeintrag mit meinem Problem zu tun haben könnte...
- Soll er Dir zeigen dass es auch ohne Postback geht
- Ohne UpdatePanel und daher die Seite schlanker ist
- Das der Timer auch selber implementiert werden kann
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
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?
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
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
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?
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
Hi, ja sind static.
Aber kann es sein, daß dies in einer Masterpage nicht funktioniert?
Bei einer normalen ASPX Seite gehts nämlich...
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
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?
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
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!