JavaScript aus CodeBehind (User Control) ausführen

Eroli

Erfahrenes Mitglied
Hallo zusammen,

ich google schon schon etwas länger nach diesem Thema, doch meistens wird es nur in Zusammenhang mit Pages behandelt und nicht mit PostBacks...

Folgendes: Ich habe ein Popup mit einem speichern Button und ich möchte, dass beim Klick auf "speichern" der Datensatz eingetragen und dann das Popup geschlossen wird.
Das Eintragen in die Datenbank erfolgt mittels C# und ist kein Problem, doch wie kann ich aus dem CodeBehind nach der Eintragung ein JavaScript ausführen, dass mir das Popup schließt?

Das Script ist kein Problem, das habe ich schon an einem Standalone-Button getestet (mit OnClientClick) und das funktionierte. Nur diese kombinierte Lösung bereitet mir Kopfzerbrechen...

Ist es überhaupt möglich JavaScript aus dem CodeBehind eines UserControls auszuführen?

Vielen Dank,
Eroli
 
Du könntest z.B. bei einem PostBack das entsprechende JavaScript ausgeben.
C#:
if(IsPostBack)
    //Response.Write ist natürlich nicht die beste Variante. Besser wäre z.B. ein asp:Literal Control zur Ausgabe. Aber da gibt es diverse Möglichkeiten
    Response.Write("<script type=\"text-javascript\">window.close();</script>);

Noch schöner wäre es, die Daten per JavaScript zu versenden (und nicht über ein Formular) und das Popup zu schließen, sobald die Antwort des Servers da ist.
 
Gerade getestet. Kompiliert ohne Fehler und wirft keine Exception (logisch eigentlich).

Jedoch wird das JavaScript nicht ausgeführt. Ich finde sogar nirgends wo dieser String in den Seitenquelltext hingeschrieben wird...
Auch ein einfaches
C#:
Response.Write("<script language=\"javascript\">alert('hi');</script>");
war ohne jedes Ergebnis...

Woran kann das liegen? Muss ich irgendwo einen ScriptManager platzieren? Wenn ja, wo? Auf der eigentlichen Page (in der das UserControl liegt) oder im UserControl oder erst im eigentlichen Popup (ist ja auch wieder eine "Page" mit eingebettetem UserControl)****?

Hoffe mir kann jemand helfen...

Ciao,
Eroli

EDIT: Mit einem Script-Manager im eigentlichen UserControl(also das eigentliche "PopupUserControl") erscheint der String in Response.Write ganz am Anfang des Framequelltextes....Ausgeführt wird er jedoch nicht?
So sieht mein Frame aus:

Code:
<script type="text-javascript">alert('hi');</script>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script type="text/javascript">
     <%--Hier steht das JavaScript drin, dass ich ausführen will!!-->
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
[...]

EDIT2:
Folgender Code gibt mir das alert aus:
C#:
Response.Write("<script language=\"text/javascript\">alert('hi');</script>");

Jedoch habe ich jetzt das Problem, dass meine eigentliche Funktion, die ich aufrufen will, in einem ganz anderem Script-Block liegt. Die Struktur sieht in etwa so aus:
Code:
<script type="text/javascript">CloseWithArg();</script> <%--Das war mein Response.Write()-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<script type="text/javascript">
            function GetRadWindow() {   <%--Diese Funktion soll von meinem Skript aufgerufen werden-->
        var oWindow = null;

        if (window.radWindow)
            oWindow = window.radWindow;
        else if (window.frameElement.radWindow)
            oWindow = window.frameElement.radWindow;

        return oWindow;
    }

</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
	[...]
</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<%--Ein paar links (CSS-Einbindungen etc)-->
</head>
<body>
    <form name="form1" method="post" action="kundenTypPopup.aspx?mode=new&amp;Popup=1" id="form1">
</div>
    <div>
        <div id="e2wMiddleCol">
            <div id="e2wShadowTop">
                <div id="e2wShadowBottom">
                    <div id="e2wShadowSides">
                        <!-- + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Content -->
<script type="text/javascript">
    function CloseWithArg() { <%--DIESE Funktion will ich aufrufen******-->
        alert('hi');
        var guid = document.getElementById('CustomerTypeControl1_hidGuid').value;
        var name = document.getElementById('CustomerTypeControl1_hidTypBezeichnung').value;
        var array = new Array();
        array[0] = name;
        array[1] = guid;
        GetRadWindow().close(array);
    }

    function Close() {
        GetRadWindow().close();
    }
</script>

[...]<%--Hier folgt der eigentliche Content-->

SkriptBlock-übergreifende Funktionsaufrufe funktionieren nicht, richtig? Muss ich die Funktion CloseWithArg() dann noch einmal mit durch den Response schicken?
 
Zuletzt bearbeitet:
Der Übersichtlichkeit halber ein neuer Beitrag und kein Edit.

Mein Response.Write sieht derzeit so aus:

C#:
Response.Write("<script type=\"text/javascript\">\n" +
                    "function CloseWithArg() {\n" +
                    "alert('1');\n" +
                    "var guid = document.getElementById('CustomerTypeControl1_hidGuid').value;\n" +
                    "alert('2');\n" +
                    "var name = document.getElementById('CustomerTypeControl1_hidTypBezeichnung').value;\n" +
                    "alert('3');\n" +
                    "var array = new Array();\n" +
                    "alert('4');\n" +
                    "array[0] = name;\n" +
                    "alert('5');\n" +
                    "array[1] = guid;\n" +
                    "alert('6');\n" +
                     "GetRadWindow().close(array);\n" +
                    "}\n\n" +
                    "function Close() {\n" +
                    "alert('7');\n" +
                    "GetRadWindow().close();\n" +
                    "}\n" +
                    "CloseWithArg();\n" +
                    "</script>");

Wenn ich das Ganze nun ausführe erscheint direkt nach dem Start zwar das alert('1'), doch weiter schafft es das Skript nicht. Vermutlich findet es die Controls, die es braucht, nicht...

Gibt es hier eine andere Möglichkeit als die benötigten Variablen (die sich das Skript sonst selber gesucht hätte) aus dem Codebehind mitzugeben?
 
Hallo,

habe jetzt alle anderen Skripts mit in das Skript integriert, sodass sich alles in einem SkriptBlock befindet. Jetzt funktioniert es endlich.

Ich finde diese Lösung zwar unschön, aber es funktioniert. Interesse halber: Kann man das eleganter lösen?

Ich warte noch 2 Tage oder auf eine Antwort und dann markiere ich das hier als erledigt.

Danke für die Hilfe!

Ciao,
Eroli
 
SkriptBlock-übergreifende Funktionsaufrufe sind überhaupt kein Problem. Sonst könnte man ja auch keine externen Javascript Bibliotheken einbinden. Auch spielt die Reihenfolge keine Rolle.

Ich verstehe im Moment deinen Aufbau noch nicht ganz. Du möchtest ein Fenster schließen, wenn dort ein Postback durchgeführt wurde? Dazu musst du doch lediglich beim Postback das entsprechende Javascript ausgeben. Hier mal kurz etwas Code.
Da ich alles aus dem Gedächtnis tippe, sind Syntaxfehler vorbehalten :-D

HTML:
<!--...-->
<script type="text/javascript">
    /* <![CDATA[ */
    function hallo() {
        alert("Hallo Tutorials.de");
    }
    /* ]]> */
</script>

<!--Hier ist jetzt irgendein Control mit der id "foobar"-->
<asp:Irgendwas runat="server" id="foobar"></asp:Irgendwas>

<asp:PlaceHolder runat="server" id="placeholder_script" visible="false">
    <script type="text/javascript">
        /* <![CDATA[ */
        //wenn du hier noch irgendwas mit foobar machen willst, dann so
        document.getElementById('<%=foobar.ClientID %>');
        
        //alle irgendwo definierten funktionen sind auch hier verfügbar
        hallo();

        window.close();
        /* ]]> */
    </script>
</asp:PlaceHolder>
<!--...-->

Codebehind
C#:
//....
protected void Page_Load()
{
    if(IsPostBack)
    {
        placeholder_script.Visible = true;
        return;
    }
}
//....

Falls dich das nicht zum Ziel führt, musst du nochmal erklären, was du eigentlich vor hast.
 
Zurück