5 Stimmen

Aufruf einer Javascript-Funktion auf der Server-Seite

Wie man eine Javascript-Funktion innerhalb der Server-Seite aufrufen, nachdem der Code in Seite laden/irgendwelche Ereignisse ausgeführt wird? Ich verwende UpdatePanel in dieser Seite. Ich hatte versucht Page.RegisterStartUpScript, ClientScript.RegisterStartupScript . Das alles funktioniert nicht.

6voto

Nick Craver Punkte 609016

Bei einem UpdatePanel müssen Sie Folgendes verwenden ScriptManager.RegisterStartupScript etwa so:

var script = "alert('hi);";
ScriptManager.RegisterStartupScript(this, GetType(), "MyScript", script, true);

Sie müssen bedenken, dass Sie bei einem UpdatePanel nicht die gesamte Seite an den Client zurücksenden, so dass die Page Versionen funktionieren nicht, da ihr Inhalt bei einer teilweisen Aktualisierung nirgendwo hin verschwindet. Mit ScriptManager schiebt es dies aktiv in die AJAX-Antwort, die es als auszuführendes Skript sendet, so dass es sich ein wenig anders verhält.

1voto

David Punkte 11

Erst gestern habe ich einige Nachforschungen angestellt, um einem Kollegen zu helfen, und bin dabei auf die folgende Lösung gestoßen. Sie stützt sich auf einige Techniken, die in Ajax Control Extenders bei der Verwendung von registrierten Datenelementen verwendet werden. Da ich wollte, dass dies eher ein generischer Ansatz ist, habe ich den folgenden Code in einen Skriptblock in der Masterseite direkt nach dem scriptmanager-Objekt eingefügt:

Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(PageLoadingHandler); function PageLoadingHandler(sender, args) { var dataItems = args.get_dataItems(); if ($get('<%=JSBridge.ClientID%>') !== null) { eval(dataItems['<%=JSBridge.ClientID%>']); } }

Dann irgendwo in der Markup der Master-Seite habe ich ein hiddenfield wie in:

asp:HiddenField ID="JSBridge" runat="server"

Das war's mit der Hauptseite. Nun erben alle meine Webseiten von einer Basisseite, also habe ich eine Methode in der Basisseite wie in:

public void InvokeScriptMethod(string methodName, string[] methodArgs) { string sArgs = string.Empty; string delim = string.Empty; bool isNumeric = false; int iArg = 0;

        if (methodArgs != null && methodArgs.Length > 0)
        {
            foreach (string arg in methodArgs)
            {
                isNumeric = int.TryParse(arg, out iArg);
                sArgs += delim + ((isNumeric) ? arg : "'" + arg + "'");
                delim = ",";
            }
        }

        ScriptManager manager = (ScriptManager)Master.FindControl("ScriptManager1");

        if (manager.IsInAsyncPostBack)
        {
            manager.RegisterDataItem(Master.FindControl("JSBridge"), methodName + "(" + sArgs + ")");
        }
    }

Angenommen, Ihr Inhalt befindet sich in einem Update-Panel, eine Schaltfläche wird angeklickt oder ein beliebiges Ereignis auf einer beliebigen Webseite ausgelöst, dann können Sie einfach Folgendes tun:

protected void MyButton_Click(object sender, EventArgs e) { //-- Aufruf der Basisseitenmethode zum Aufrufen des Javascript-Aufrufs InvokeScriptMethod("ShowMessage", new string[] { "David", "Whitten", "44" }); }

Dabei wird davon ausgegangen, dass Sie irgendwo eine Javascript-Methode namens "ShowMessage" mit den erforderlichen Parametern haben. Natürlich kann man einen beliebigen Methodennamen und eine beliebige Anzahl von Parametern angeben.

Ich wollte nur meine Erkenntnisse mitteilen. Vielleicht gibt es sogar einen besseren Weg, aber ich finde dies ziemlich einfach und flexibel.

David

0voto

rick schott Punkte 20895

ScriptManager.RegisterStartupScript

Registriert einen Startskriptblock für eine Steuerelement, das sich innerhalb eines UpdatePanel befindet, unter Verwendung des ScriptManager-Steuerelements, und fügt den Skriptblock zu der Seite hinzu.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X