Zusammenfassung: In diesem Artikel wird erläutert, wie Sie mithilfe von CodeBehind in ASP.NET verschiedene Popup-Fenster implementieren und mit Popup-Fenstern interagieren. Außerdem werden die verschiedenen Filterverhalten häufig verwendeter, nicht standardmäßiger IE-Browser für Popup-Fenster und die entsprechenden Gegenmaßnahmen für die Verwendung von Popup-Fenstern erörtert, um eine universelle und bessere Lösung für die Verwendung von Popup-Fenstern bereitzustellen.
Schlüsselwörter: ASP.NET, CodeBehind, Filterung, COM-Schnittstelle, JavaScript, Bindung.
Als neuestes Tool von Microsoft zum Erstellen dynamischer Websites hat ASP.NET im Vergleich zu ASP und JSP große Fortschritte bei der Änderung der ursprünglichen Webprogrammierungsmethode gemacht. Seine Code- und Seitentrennungstechnologie (CodeBehind) und die vollständige Webserversteuerung bieten Programmierern eine webserverseitige Entwicklungsmethode, die eher der traditionellen Programmierung entspricht. Allerdings weist die Webprogrammierung immer noch Merkmale auf, die sich von der herkömmlichen Programmierung unterscheiden. Diese Merkmale bestimmen, dass bei der ASP.NET-Programmierung einige spezielle Techniken verwendet werden müssen, um die Programmanforderungen zu erfüllen. Popup-Fenster sind der Vertreter dieser Art von Programmiermethode. Etliche Programmierbücher schweigen über Popup-Fenster oder erwähnen sie nur in einem Wort und scheinen die riesige Anwendungswelt von Popup-Fenstern nicht zu verstehen. Dieser Artikel wird die meisten Probleme bei der Verwendung von Popup-Fenstern für Sie lösen.
Um die Parallelität und den Durchsatz des Website-Zugriffs zu verbessern, verwendet ASP.NET wie andere Serverskripte auch clientseitige Skripte, um den Druck auf den Server zu verringern. ASP.NET unterstützt Popup-Fenster bisher nicht direkt (Version 1.1) und clientseitige Popup-Fenster müssen über JavaScript (oder VBScript) verwendet werden.
1. Warnfenster und die Methode zur Verwendung des clientseitigen Skripts in CodeBehind.
Um das einfachste Warnfenster im Browser anzuzeigen, können Sie die JavaScript-Anweisung verwenden:
window.alert([sMessage]),
wobei sMessage die Aufforderungsnachricht ist. Leider verfügt ein solches Popup-Fenster nur über einen „OK“-Button und kann nur als Hinweis dienen. Wenn wir beim Löschen eines Datensatzes ein Abfrage-Popup-Fenster öffnen möchten, müssen Sie Folgendes verwenden:
bConfirmed = window.confirm([sMessage]),
wobei: bConfirmed der Rückgabewert und sMessage die Eingabeaufforderungsnachricht ist. Dieses Popup-Fenster verfügt über zwei Optionen: „OK“ oder „Give Up“, und der Rückgabewert seiner Wahl wird in bConfirmed platziert, damit der Code eine Beurteilung vornehmen kann.
Um die Wiederverwendbarkeit und Lesbarkeit von Code zu verbessern, sollten JavaScript und Codehind miteinander integriert werden. Normalerweise gibt es zwei Möglichkeiten, diesen Effekt zu erzielen.
(1) Verwenden Sie die Response.Write-Methode:
Die Verwendung der Response.Write-Methode wurde bereits in der ASP-Ära unterstützt. Es kann Code an den Client schreiben, was eine sehr praktische und intuitive Methode ist. Der folgende Code zeigt, wie Sie mit der Response.Write-Methode eine Warnmeldung anzeigen.
Private Sub btAlert_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Behandelt btAlert.Click
' Demonstriert die Response.Write-Methode und das Warnfenster.
Response.Write(" ")
End Sub
(2) Verwenden Sie die RegisterXXX-Methode.
Wenn Sie den von Response.Write generierten HTML-Code beobachten, werden Sie feststellen, dass der von der Response.Write-Methode generierte Code ganz am Anfang des HTML-Codes geschrieben wird das Etikett. Zu diesem Zeitpunkt wurden noch nicht alle HTML-Objekte generiert. Wenn Sie Objekte in HTML verwenden und mit ihnen interagieren möchten, tritt die Fehlermeldung „Objekt nicht gefunden“ auf. Daher empfiehlt der Autor eine Methode, die eher der CodeBehind-Methode entspricht – die Verwendung der RegisterXXX-Methode. RegisterXXX umfasst: RegisterClientScriptBlock, RegisterStartupScript und die Funktion IsStartupScriptRegistered zur Beurteilung.
Der Prototyp von RegisterStartupScript ist:
Overridable Public Sub RegisterStartupScript( _
ByVal-Schlüssel als String, _
ByVal-Skript als String _
)
, wobei „key“ die eindeutige Kennung dieses Skripts darstellt und „script“ eine Zeichenfolge ist, die das Skript darstellt.
Der Prototyp von RegisterClientScriptBlock ist derselbe wie RegisterStartupScript. Der Unterschied zwischen den beiden Funktionen besteht darin, dass der darin enthaltene Skriptcode an unterschiedliche Stellen in der HTML-Datei geschrieben wird. RegisterClientScriptBlock gibt das Client-Skript unmittelbar nach dem öffnenden Tag des Elements des Page-Objekts aus, und RegisterStartupScript gibt das Skript vor dem schließenden Tag des Elements des Page-Objekts aus. Wenn Ihr Skript Anweisungen enthält, die mit dem Seitenobjekt (Dokumentobjekt) interagieren (dies wird in unseren späteren Beispielen gezeigt), wird empfohlen, RegisterStartupScript zu verwenden. Wenn Sie jedoch möchten, dass das Client-Skript bereits ausgeführt wird Möglicherweise können Sie RegisterClientScriptBlock oder Response.Write verwenden.
Um das wiederholte Hinzufügen von Skripten zur Seite zu verhindern, verwendet ReisterStartupScript/RegisterClientScriptBlock beim Registrieren des Skripts den Schlüssel als Registrierungsschlüssel. Anschließend kann IsClientScriptBlockRegistered verwendet werden, um im Programm Beurteilungen vorzunehmen.
Im folgenden Beispiel wird RegisterClientScriptBlock verwendet, um die Verwendung von „Bestätigen“ zu demonstrieren.
Private Sub btConfirm_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Behandelt btConfirm.Click
'Demonstrieren Sie die RegisterClientScriptBlock-Methode und bestätigen Sie windowIf
(Not IsClientScriptBlockRegistered("clientScript")) Then
„Stellen Sie fest, ob das Skript hinzugefügt wurde. Wenn nicht, fügen Sie es hinzu.“
Dimmen Sie strScript als String
strScript = " "
'Register scriptRegisterClientScriptBlock("clientScript", strScript)
'Wenn Sie „Nein“ wählen, fahren Sie mit der Ausführung fort.
End If
End Sub
2.
Nur ein Eingabeaufforderungsfenster genügt nicht. Im Programm müssen wir oft die angegebene Seite öffnen. Zu diesem Zeitpunkt können Sie die Methode window.open von JavaScript verwenden. Mit der vorherigen RegisterClientSciptBlock-Methode können wir die angegebene Seite aufrufen.
Der folgende Code zeigt, wie die angegebene Seite angezeigt wird:
Private Sub btWinOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btWinOpen.Click
'Verwenden Sie window.open und registerStartupScript für eine einfache Demonstration.
Wenn (nicht IsClientScriptBlockRegistered("OpenScript")) Dann
„Stellen Sie fest, ob das Skript hinzugefügt wurde. Wenn nicht, fügen Sie es hinzu.“
Dim strScript As String = " "
RegisterStartupScript("OpenScript", strScript)
Ende wenn
End Sub
-Programm verwendet die Window.open-Methode, um eine neue Seite zu öffnen, die nur einen Parameter hat: die URL-Adresse des neuen Popup-Fensters. Es stellt sich heraus, dass die Methode window.open mehrere Parameter hat, aber das ist eine einfache Frage von Javascript und wir werden hier nicht auf Details eingehen. Wenn Sie diesbezügliche Fragen haben, schauen Sie bitte im MSDN nach.
Dieses Programm funktioniert gut, wenn es direkt im IE verwendet wird. Aber wenn Sie Browser wie GoSurf, MyIE2, NetCapter usw. verwenden, dann leider! Es werden keine Pop-ups angezeigt. Dies ist, was wir über Popup-Filter besprechen werden.
3. Besprechen Sie das Popup-Fensterfilterverhalten von nicht standardmäßigen IE-Browsern.
Die Verbreitung von Werbefenstern hat dazu geführt, dass viele Internetnutzer nicht mehr mit Werbung belästigt werden. Sie haben auf Standard-IE-Browser verzichtet und Browser wie GoSurf, MyIE2 usw. verwendet. und NetCapter, die den IE-Kernel verwenden, um mehrere Seiten zu unterstützen, und Software, die Werbung automatisch blockiert. Es heißt, dass Microsoft im kommenden IE6 SP2 auch die Funktion zum Blockieren von Werbefenstern hinzufügen wird. Für die meisten Internetnutzer ist das natürlich eine gute Sache, aber für Programmierer unterscheidet sich die Art und Weise, wie wir Popup-Fenster verwenden, nicht grundlegend von gewöhnlichen Anzeigen. Solche Fenster werden auch wahllos vom Popup-Fenster-Manager blockiert Natürlich wollen wir es nicht sehen. Gibt es eine Standardmethode, mit der das Fenster normal geöffnet werden kann? Dies erfordert, dass wir das Prinzip der Browser-Blockierung von Werbung verstehen. Gängige Werbeblocker verwenden die folgenden drei Methoden zum Filtern von Anzeigen:
(1) Fenstertitel-basierte Blockierungsmethode
Das Prinzip dieser Blockierungsmethode besteht darin, alle IE-Fenstertitel regelmäßig zu überprüfen und sie dann basierend auf der vorhandenen Liste (von der verwaltet) zu filtern Programm). Eine Array-Liste) zum Vergleichen, wenn es dasselbe gibt, schließen wir dieses Fenster. Offensichtlich weist diese Methode viele Mängel auf. Sie blockiert alle Popup-Fenster und ist zu streng. Sie wird im Programm selten verwendet. Die darauf basierende Verformungsmethode ist jedoch weit verbreitet. Das heißt, die intelligente Filtertechnologie basierend auf dem Namen des Fenstertitels blockiert Popup-Fenster basierend darauf, ob der Titel Schlüsselwörter enthält, die sich auf Werbung beziehen. Dies ist eine gute Möglichkeit, den Filtereffekt zu verbessern.
(2) Blockierungsmethode basierend auf Fensterklasse und Standort
Nach der Analyse wurde festgestellt, dass die Klassennamen normaler Browserfenster IEFRAME und CabinetWClass sind, während der Klassenname von Werbefenstern CabinetWClass ist. Eine weitere Analyse ergab Folgendes: Die Werte von rect.top der WorkerA-Klasse des Werbefensters und der Shell DocObject View-Klasse sind gleich, aber die Werte von rect.top der WorkerA-Klasse des normalen IE-Fensters und Die Shell DocObject View-Klasse ist unterschiedlich. Basierend auf den beiden oben genannten Punkten können Sie ein Werbekillerprogramm schreiben. Tatsächlich bin ich skeptisch, was die Generalisierbarkeit dieses Programms angeht. Da der Autor Spy ++ zur Analyse verwendet und festgestellt hat, dass in Windows 2000 (dem vom Autor verwendeten Betriebssystem) die Klassen von IE-Fenstern alle IEFrame sind. Da Win2000 ein auf Unicode-Code basierendes Betriebssystem ist, gibt es gleichzeitig keine WorkerA-Klasse und wird durch die WorkerW-Klasse ersetzt. Gleichzeitig gibt es keine Situation, in der rect.top anders ist. Da der Autor kein WindowsXP-Betriebssystem hat, kann ich keine weiteren Experimente unter WindowsXP durchführen.
(3) Blockierungsmethoden basierend auf IE-COM-Komponenten.
Die beiden oben genannten Methoden behandeln das IE-Fenster wie ein gewöhnliches Windows-Fenster und treffen Beurteilungen. Tatsächlich ist der IE ein typischer Browser, der auf COM-Komponenten basiert. Alle Browser basieren auf der IE-Kerndatei und schreiben dann den entsprechenden BHO-Code. Nur so können wir den IE-Browser wirklich kontrollieren, anstatt wie bei den Methoden eins und zwei an der Oberfläche zu kratzen.
Es gibt auch eine Methode zum Blockieren von Popup-Fenstern, die auf dem IE-Kernel basiert. Es blockiert Popups, bevor sie geöffnet werden. Das Prinzip ist: Immer wenn der IE ein neues Fenster öffnet, wird das NewWindow-Ereignis ausgelöst und die Methode OnNewWindow2([out] IDispatch*, [out] BOOL *bCancel) ausgeführt. Überladen Sie diese Methode, um festzustellen, ob das neue Fensteröffnungsereignis auftritt, nachdem die Browserseite heruntergeladen wurde. Wenn dies der Fall ist, bedeutet dies, dass es sich um ein normales Popup-Fenster handelt. Andernfalls wird es abgefangen.
Da Browser wie Gosurf die Shocvm.dll-Komponente überlasten, ist es naheliegend, die dritte Methode zu verwenden. Bei der Verwendung stellen wir jedoch manchmal fest, dass die Anzeigenfilterung nicht perfekt ist, das Prinzip jedoch im Grunde dasselbe ist.