Benutzer mit den meisten Antworten
modales Popup im CodeBehind schließen (Bootstrap)

Frage
-
Hallo liebe Formumsmitglieder,
allen erst einmal ein friedliches neues Jahr.Dieses Problem bezieht sich auf einen anderen Post von mir, ist aber ein anderes Thema, weshalb ich einen neuen Thread aufgemacht habe (Thread).
Hintergrund ist, dass ich statt mehreren nur ein PopUp verwenden möchte und in dieses verschiedene Daten, je nach 'sender' geladen werden sollen. Und da ich in JavaScript nicht so fit bin, muss ich diese eben per VB.Net laden.
Jedenfalls, nach diesem Schema (Link1, Link2) habe ich auf einer ASP.Net-Seite ein modales Popup eingebunden.
Dieses wird innerhalb einer Tabelle durch einen LinkButton angezeigt.
Möchte ich das Popup jedoch wieder schließen, so tut sich überhaupt nichts, weder über Abbrechen oder das Schließen-Feld. Es funktioniert nur über [ESC].
Merkwürdigerweise wird auch nach dem Anzeigen des Popups der Hintergrund nicht grau hinterlegt.
Was mich auch noch verwundert, ist, dass es in der Anzeigefunktion (OpenPopup) egal ist, ob 'show' oder 'hide' angegeben wird.Wenn das Popup, wie im Original per HTML-Button angesprochen wird, so funktioniert alles einwandfrei. Nur eben nicht über einen VB-Aufruf.
Hat evtl. jemand einen Tipp?
Wäre sehr dankbar dafür.Anbei die Codebeispiele:
Das Popup:
<div class="modal" id="modalPopupSchulung" tabindex="-1" role="dialog" aria-labelledby="meinModalLabel"> <div class="modal-dialog" role="document"> <asp:UpdatePanel ID="updModal" runat="server" ChildrenAsTriggers="false" UpdateMode="Conditional"> <ContentTemplate> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Schließen"><span aria-hidden="true">×</span></button> <h4 class="modal-title" id="meinModalLabel">Schulung eintragen</h4> </div> <div class="modal-body"> <asp:Label ID="lblTest" runat="server" Text="" /> </div> <div class="modal-footer"> <button type="button" class="btn btn-default" data-dismiss="modal">Abbrechen</button> <asp:LinkButton ID="btnEintragen" runat="server" CssClass="btn btn-primary" Text="Schulung eintragen" /> </div> </div> </ContentTemplate> </asp:UpdatePanel> </div> </div>
Die Funktion zum Anzeigen:
Protected Sub OpenPopup(sender As LinkButton, e As EventArgs) Dim btn As LinkButton = sender lblTest.Text = "geöffnet" updModal.Update() ScriptManager.RegisterStartupScript(Page, Page.GetType(), "ScriptPopupShow", "$('#modalPopupSchulung').modal('show');", True) End Sub
Die Funktion zum Ausblenden:
Protected Sub btnEintragen_Click(sender As LinkButton, e As EventArgs) Handles btnEintragen.Click lblTest.Text = "eingetragen" updModal.Update() ScriptManager.RegisterStartupScript(Page, Page.GetType(), "ScriptPopupHide", "$('#modalPopupSchulung').modal('hide');", True) End Sub
Mit diesem Button funktioniert es tadellos:
<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#modalPopupSchulung"> Modal-Beispiel anzeigen </button>
Vielen Dank.
Viele Grüße, Volker
- Bearbeitet Volker S Dienstag, 3. Januar 2017 14:08 Fehler korrigiert
Antworten
-
Hallo Volker,
das, was Du da machen willst, geht so nicht bzw. nur über Umwege, die das Ganze so verkomplizieren, dass es wohl den Rahmen des Supports, der über ein Forum möglich ist, sprengt.
Lass die serverseitigen Geschichten, insbesondere das UpdatePanel und deine serverseitigen Buttons inkl. der EventHandler der Buttons an der Stelle weg. D.h.: Arbeite clientseitig per Javascript, um die clientseitigen Aktionen (öffnen und schließen Dialog, Anzeige Daten, Aufruf des serverseitigen Codes zur Datenspeicherung, ...) durchzuführen und serverseitig, um eben die serverseitigen Aktionen durchzuführen (Daten lesen, Daten speichern, mehr eigentlich nicht). Eine Vermischung der beiden Welten führt letztendlich immer zu Problemen. Es geht zwar aber man muss sich ja nicht auch noch wissentlich mit der Schrotflinte ins Bein schießen :)
Erstell dir einen Webservice, der die Daten der Schulung entgegennimmt, ruf diesen mit jQuery.ajax auf und schließ das Popup im success Handler dann per JavaScript.
Ein Beispiel findest Du hier:
http://www.c-sharpcorner.com/code/556/how-to-show-data-in-bootstrap-popup.aspx
Einen Codekonverter dann hier:
Dein Einwand, dass Du mit JavaScript noch nicht so viel anfangen kannst, ist leider kein Grund, warum man es anders machen sollte oder könnte.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Volker S Donnerstag, 5. Januar 2017 08:27
Alle Antworten
-
Ich fürchte, du wirst dich ein wenig mit JavaScript auseinandersetzen müssen, wenn du JavaScript verwenden willst...
Dein JavaScriptCode, den du über RegisterStartupScript einfügst, wird "irgendwann" ausgeführt. Üblicherweise, bevor die komplette Seite und damit eben vorallem auch dein Control geladen ist. $('#modalPopupSchulung') ist dann null und entsprechend gibt es nichts zu schliessen.
Verpacke dein JavaScript in ein $(document).ready(). Das sollte schon mal helfen.
-
Hallo Volker,
Javascript ist auf jeden Fall erheblich einfacher als die unsäglichen Controls aus dem AjaxControlToolkit. Die solltest Du wirklich mal entsorgen und bspw. auf jQuery UI oder ähnliches umstellen.
Auch sinnvoll wäre der Wechsel von ASP.NET WebForms zu etwas modernerem. Ob das nun gleich ASP.NET Core sein muss oder auch erst mal ASP.NET WebPages, sei dahingestellt. Mit WebForms hast Du aber derart viele Problemstellen, die man gerade bei komplexen Anwendungen nur schwer umschiffen kann, dass ein Technologiewechsel wahrscheinlich dennoch weniger Aufwand sein wird.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Volker,
ob es ein Buch speziell zu WebPages gibt, weiß ich nicht.
Ein guter Einstieg wäre aber:
Bedenke aber, dass die Zukunft ASP.NET Core heißt. Und das ist wieder etwas komplett anderes als alle anderen ASP.NET Varianten, die es bisher gab.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan, Christoph,
danke nochmals für eure Hilfestellungen.
Den Tipp von Christoph hab ich versucht umzusetzen.
Ich muss aber ehrlich gestehen, dass ich nicht weiterkomme.
Wo muss denn was hin? Wenn ich den Aufruf aus RegisterStartupScript in ein document.ready() verpacke, dann wird das bei jedem Laden der Seite ausgeführt, so auch beim ersten Start.
Wie könnte man denn das Problem am besten lösen?Wie du bemerktest, so sollte ich wahrscheinlich doch schon irgendwann zu WebPages/NetCore wechseln, aber im Moment fehlt mir dazu einfach die Zeit, da jetzt einzusteigen und um das jetzige Projekt umzustellen.
Und man ist ja auch nicht mehr der Jüngste, dass alles so leicht von der Hand geht. :/Das AjaxControlToolkit benutze ich aber sowieso nicht. Und mit jQuery bin ich auch am werkeln, aber noch weit entfernt, um eben solche Probleme zu lösen.
Ich wäre wirklich sehr dankbar, wenn mir evtl. ein entsprechendes Codebeispiel vorliegen würde. Oder vielleicht gibt es auch einen ganz anderen Ansatz? Ich bin da für jeden Vorschlag offen.
Versteht mich bitte nicht falsch, geht es mir nicht darum, dass ich zu faul wäre es selbst zu machen oder nach entsprechenden Beispielen zu suchen. Ich steh z.Zt. einfach auf dem Schlauch und bekomme es einfach nicht hin. Das einzige was ich dazu bisher fand, sind eben nur die Verweise auf RegisterStartupSript.Viele Grüße, Volker
-
Hallo Volker,
das, was Du da machen willst, geht so nicht bzw. nur über Umwege, die das Ganze so verkomplizieren, dass es wohl den Rahmen des Supports, der über ein Forum möglich ist, sprengt.
Lass die serverseitigen Geschichten, insbesondere das UpdatePanel und deine serverseitigen Buttons inkl. der EventHandler der Buttons an der Stelle weg. D.h.: Arbeite clientseitig per Javascript, um die clientseitigen Aktionen (öffnen und schließen Dialog, Anzeige Daten, Aufruf des serverseitigen Codes zur Datenspeicherung, ...) durchzuführen und serverseitig, um eben die serverseitigen Aktionen durchzuführen (Daten lesen, Daten speichern, mehr eigentlich nicht). Eine Vermischung der beiden Welten führt letztendlich immer zu Problemen. Es geht zwar aber man muss sich ja nicht auch noch wissentlich mit der Schrotflinte ins Bein schießen :)
Erstell dir einen Webservice, der die Daten der Schulung entgegennimmt, ruf diesen mit jQuery.ajax auf und schließ das Popup im success Handler dann per JavaScript.
Ein Beispiel findest Du hier:
http://www.c-sharpcorner.com/code/556/how-to-show-data-in-bootstrap-popup.aspx
Einen Codekonverter dann hier:
Dein Einwand, dass Du mit JavaScript noch nicht so viel anfangen kannst, ist leider kein Grund, warum man es anders machen sollte oder könnte.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Volker S Donnerstag, 5. Januar 2017 08:27
-
Hallo Volker,
prima. Und natürlich darfst Du dich bei Fragen und/oder Problemen gerne wieder hier melden.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community