Aufruf der JavaScript-Funktion von CodeBehind

150

Kann jemand gute Beispiele für das Aufrufen einer JavaScript-Funktion von CodeBehind und umgekehrt liefern?

ssmsnet
quelle
Hier ist ein detaillierter Artikel codepedia.info/… mit und ohne Ajax Update Panel
Satinder singh

Antworten:

206

Sie können dies versuchen:

Page.ClientScript.RegisterStartupScript(this.GetType(),"CallMyFunction","MyFunction()",true);
mutanisch
quelle
41
Ich würde für den ScriptManager.RegisterStartupScript (Seite, Typ (Seite), "somekey", Skript, true) gehen; Ansatz. Es funktioniert auch bei Teilpostbacks.
rdmptn
10
1. Manchmal Page.ClientScript.RegisterClientScriptBlockist stattdessen erforderlich, stattdessen lesen Sie diesen Beitrag für Informationen . 2. Es kann erwähnenswert sein, dass MyFunction () vor den Formular-Tags oder innerhalb der Formular-Tags definiert werden muss, damit MyFunction () funktioniert, jedoch NICHT nach dem End-Tag </ form> (andernfalls wird ein Objekt-Fehler erwartet auftreten)
BornToCode
2
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "text", "openDep()", true);funktioniert. this.GetType()wirft einen Fehler für mich.
SearchForKnowledge
2
Dies funktioniert nicht, wenn der Code mit einem umschlossen asp:UpdatePanelund in ein Schaltflächenereignis geschrieben ist. Dadurch wird die Seite zurückgesetzt.
Senura Dissanayake
52

C # zu JavaScript: Sie können den Skriptblock registrieren, um ihn auf einer Seite wie folgt auszuführen:

ClientScript.RegisterStartupScript(GetType(),"hwa","alert('Hello World');",true);

Ersetzen Sie das alert()Teil durch Ihren Funktionsnamen.

Zum Aufrufen der C # -Methode aus JavaScript können Sie ScriptManageroder verwenden jQuery. Ich persönlich benutze jQuery. Sie müssen die Methode, die Sie aus JavaScript aufrufen möchten, mit WebMethodAttributen dekorieren . Weitere Informationen zum Aufrufen der C # -Methode (aufgerufen PageMethod) finden jQuerySie in Dave Wards Beitrag.

TheVillageIdiot
quelle
51

Aufruf einer JavaScript-Funktion aus dem Code dahinter

Schritt 1 Fügen Sie Ihren Javascript-Code hinzu

<script type="text/javascript" language="javascript">
    function Func() {
        alert("hello!")
    }
</script>

Schritt 2 Fügen Sie 1 Skript-Manager in Ihre WebForm ein und klicken Sie auf die Schaltfläche 1 hinzufügen zu

Schritt 3 Fügen Sie diesen Code in Ihr Schaltflächenklickereignis ein

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", "Func()", true);
Orlando Herrera
quelle
Wenn Sie versuchen, dies zu tun, wenn auf eine GridView-Zeile geklickt wird, funktioniert dies nur, wenn Sie ScriptManagerwie in dieser Antwort verwenden, nicht Page.ClientScriptwie in anderen Antworten. Könnte mit dem asp:UpdatePanelKommentar unter der akzeptierten Antwort zusammenhängen.
Chris
16

Sie können dies nicht direkt tun. In Standard-WebForms wird JavaScript vom Browser und C # vom Server interpretiert. Sie können eine Methode mithilfe von JavaScript vom Server aus aufrufen.

So was:

Schritt 1

public partial class Products : System.Web.UI.Page 
{ 
    [System.Web.Services.WebMethod()] 
    [System.Web.Script.Services.ScriptMethod()] 
    public static List<Product> GetProducts(int cateogryID) 
    {
        // Put your logic here to get the Product list 
    }

Schritt 2: Hinzufügen eines ScriptManagerauf demPage

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />

Schritt 3: Aufrufen der Methode mit JavaScript

function GetProductsByCategoryID(categoryID)
{
    PageMethods.GetProducts(categoryID, OnGetProductsComplete);
}

Schauen Sie sich diesen Link an.

Um eine JavaScript-Funktion vom Server aufzurufen, können Sie Folgendes verwenden RegisterStartupScript:

ClientScript.RegisterStartupScript(GetType(),"id","callMyJSFunction()",true);
Vismari
quelle
Wo platzieren Sie Schritt eins in der MVC 3-Dateihierarchie?
Rob
@Rob Die GetProducts()Funktion ist nur eine Code- Behind -Funktion, die in einem Controller in einer MVC-App ausgeführt wird. Die Tags werden also über die Funktionen gesetzt, die Sie in einen Controller einfügen möchten, den Sie über JavaScript aufrufen möchten .
Vapcguy
15

Wenn Sie einen Wert als Parameter senden müssen.

string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);
Liko
quelle
8

Sie können auch eine Sitzungsvariable erstellen, die im Code dahinter festgelegt wird, den Status dieser Variablen überprüfen und dann Ihr Javascript ausführen. Das Gute daran ist, dass Sie Ihr Skript genau dort ausführen können, wo Sie möchten, anstatt herausfinden zu müssen, ob es im DOM oder global ausgeführt werden soll.

So etwas wie das: Code dahinter:

Session["newuser"] = "false" 

In Javascript

var newuser = '<%=Session["newuser"]%>';
 if (newuser == "yes")
     startTutorial();  
Prakash Joshi
quelle
7

Du kannst nicht. Codebehind wird auf dem Server ausgeführt, während JavaScript auf dem Client ausgeführt wird.

Sie können jedoch <script type="text/javascript">someFunction();</script>zu Ihrer Ausgabe hinzufügen und so die JS-Funktion aufrufen, wenn der Browser Ihr Markup analysiert.

DiebMaster
quelle
65
"Das kannst du nicht. Aber so machst du es."
3
Ich würde das Aufrufen einer Methode aus dem serverseitigen Code nicht in Betracht ziehen, da Sie keine echte Möglichkeit haben, einen Rückgabewert abzurufen oder einen Rückruf anzugeben.
ThiefMaster
8
Oh, sicher kannst du. Sie können ein Postback von Ihrem Javascript oder AJAX alles zurückrufen. Ich dachte, es war lustig; Ich neige dazu, dasselbe zu tun - "Nein, das ist unmöglich. Niemand würde das überhaupt wollen, wenn er könnte." dann ein paar Minuten später "Also hier ist, wie wir es machen werden."
7

Sie können wörtlich verwenden:

this.Controls.Add(new LiteralControl("<script type='text/javascript'>myFunction();</script>"));
Dilip Kumar Yadav
quelle
1
Aber fügt dies nicht einfach ein Skript in den Speicher ein, sondern führt es auch nicht aus?
Fandango68
5

IIRC Code Behind wird serverseitig kompiliert und Javascript wird clientseitig interpretiert. Dies bedeutet, dass es keine direkte Verbindung zwischen den beiden gibt.

Auf der anderen Seite können Client und Server über ein nützliches Tool namens AJAX kommunizieren. http://en.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML

Berry Ligtermoet
quelle
5

Versuchen Sie dies in Code Behind und es wird 100% funktionieren

Schreiben Sie diese Codezeile in Ihre Code Behind-Datei

string script = "window.onload = function() { YourJavaScriptFunctionName(); };";
ClientScript.RegisterStartupScript(this.GetType(), "YourJavaScriptFunctionName", script, true);

Und das ist die Webformularseite

<script type="text/javascript">
    function YourJavaScriptFunctionName() {
        alert("Test!")
    }
</script>
Chandan Kumar
quelle
4
ScriptManager.RegisterStartupScript(this, this.Page.GetType(),"updatePanel1Script", "javascript:ConfirmExecute()",true/>
Apps Tawale
quelle
8
Fügen Sie einige Erklärung hinzu
Ketan
4

Arbeitsbeispiel: _

<%@ Page Title="" Language="C#" MasterPageFile="~/MasterPage2.Master" AutoEventWireup="true" CodeBehind="History.aspx.cs" Inherits="NAMESPACE_Web.History1" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
    <%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>


 <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script> 

        <script type="text/javascript">

            function helloFromCodeBehind() {
                alert("hello!")
            }


        </script>

</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">

 <div id="container"  ></div>

</asp:Content>

Code dahinter

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace NAMESPACE_Web
{
    public partial class History1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            ScriptManager.RegisterStartupScript(this, GetType(), "displayalertmessage", "helloFromCodeBehind()", true);
        }

    }
}

Mögliche Fallstricke: -

  1. Code und HTML befinden sich möglicherweise nicht im selben Namespace
  2. CodeBehind="History.aspx.cs" zeigt auf eine falsche Seite
  3. Die JS-Funktion weist einen Fehler auf
Hitesh Sahu
quelle
3

Ich habe bemerkt, dass viele der Antworten hier verwendet werden, ScriptManager.RegisterStartupScriptund wenn Sie das tun, ist das nicht der richtige Weg, dies zu tun. Der richtige Weg ist zu verwendenScriptManager.RegisterScriptBlock([my list of args here]) . Der Grund dafür ist, dass Sie RegisterStartupScript nur verwenden sollten, wenn Ihre Seite geladen wird (daher der Name RegisterStartupScript).

In VB.NET:

ScriptManager.RegisterClientScriptBlock(Page, GetType(String), "myScriptName" + key, $"myFunctionName({someJavascriptObject})", True)

in C #:

ScriptManager.RegisterClientScriptBlock(Page, typeof(string), "myScriptName" + key, $"myFunctionName({someJavascriptObject})", true);

Natürlich hoffe ich, dass Sie den Schlüssel durch Ihre Schlüsselkennung ersetzen müssen und dies wahrscheinlich in eine Unterfunktion / Methode / Methode verschieben und den Schlüssel und ein JavascriptObject übergeben sollten (wenn Ihre Javascript-Methode erfordert, dass Ihr Argument ein ist Javascript-Objekt).

MSDN-Dokumente:

https://msdn.microsoft.com/en-us/library/bb338357(v=vs.110).aspx

cr1pto
quelle
3
ScriptManager.RegisterStartupScript(Page, GetType(), "JavaFunction", "AlertError();", true);

Die Verwendung Ihrer Funktion ist ausreichend

sadistischer König
quelle
2
Können Sie Ihre Antwort etwas näher erläutern?
Maxpaj
1
Was ist dieser "JavaFunction" -Parameter? Können wir etwas hinzufügen? Was muss in diesem Argument enthalten sein?
Senura Dissanayake
1
@ SenuraDissanayake Es ist ein Titel - ja, es kann alles sein und spielt keine Rolle.
Vapcguy
2

So habe ich es gemacht.

Das HTML-Markup mit einem Beschriftungs- und Schaltflächensteuerelement lautet wie folgt.

<body> 
  <form id="form1" runat="server"> 
  <div> 
    <asp:Label ID="lblJavaScript" runat="server" Text=""></asp:Label> 
    <asp:Button ID="btnShowDialogue" runat="server" Text="Show Dialogue" /> 
  </div> 
  </form> 
</body>

Die JavaScript-Funktion ist hier.

<head runat="server"> 
  <title>Calling javascript function from code behind example</title> 
  <script type="text/javascript"> 
    function showDialogue() { 
      alert("this dialogue has been invoked through codebehind."); 
    } 
  </script> 
</head>

Code dahinter zum Auslösen der JavaScript-Funktion ist hier.

lblJavaScript.Text = "<script type='text/javascript'>showDialogue();</script>";
evaaggy
quelle
1

das funktioniert bei mir

object Json_Object=maintainerService.Convert_To_JSON(Jobitem);
ScriptManager.RegisterClientScriptBlock(this,GetType(), "Javascript", "SelectedJobsMaintainer("+Json_Object+"); ",true);
Kirk Patrick Brown
quelle
1

Da ich keine Lösung finden konnte, hinter der Code steckt, beinhaltet das Ausprobieren des ClientScriptundScriptManager wie mutanic und Orlando Herrera in dieser Frage (beide sind irgendwie gescheitert), biete ich anderen eine Front-End-Lösung an, die Tastenklicks verwendet, wenn Sie sind in der gleichen Position wie ich. Das hat bei mir funktioniert:

HTML-Markup:

<asp:button ID="myButton" runat="server" Text="Submit" OnClientClick="return myFunction();"></asp:button>

JavaScript:

function myFunction() {
    // Your JavaScript code
    return false;
}

Ich verwende einfach eine ASP.NET-Schaltfläche, die die OnClientClickEigenschaft verwendet, die clientseitige Skriptfunktionen auslöst, nämlich JavaScript. Die wichtigsten Dinge, die hier zu beachten sind, sind die Verwendungen des returnSchlüsselworts im Funktionsaufruf und in der Funktion selbst. Ich habe Dokumente gelesen, die nicht verwendet werden, returnaber trotzdem die Schaltfläche zum Klicken erhalten - irgendwie hat es bei mir nicht funktioniert. Die return false;Anweisung in der Funktion gibt an, dass ein Postback NICHT stattfinden soll. Sie können diese Anweisung auch in der OnClientClickEigenschaft verwenden:OnClientClick="myFunction() return false;"

Max Voisard
quelle
0

Ich habe ScriptManager in Code Behind verwendet und es hat gut funktioniert.

ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "CallMyFunction", "confirm()", true);

Wenn Sie UpdatePanel im ASP-Frontend verwenden. Geben Sie dann den mit Skript-Tags definierten UpdatePanel-Namen und 'Funktionsnamen' ein.

Ravi Agrawal
quelle
0

Danke "Liko", füge einfach einen Kommentar zu seiner Antwort hinzu.

string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);

Einfache Anführungszeichen ( ') zur Variablen hinzugefügt , andernfalls wird eine Fehlermeldung ausgegeben:

string jsFunc = "myFunc('" + MyBackValue + "')";
Stephen
quelle
-1

Sie können keine Javascript-Funktion über CodeBehind aufrufen, da die CodeBehind-Datei den Code enthält, der die Serverseite auf dem Webserver ausführt. Javascript-Code wird im Webbrowser auf der Clientseite ausgeführt.

Charlie Kilian
quelle
1
Sie können eine Javascript-Funktion nicht direkt wie in myCoolJavascriptFunction (javascriptFunctionArgs) aufrufen. Auf dem Server können Sie jedoch eine Javascript-Funktion aus dem Code auf einer WebForms-Seite aufrufen.
bis
vereinbart mit cloudstrifebro
Khurram Ishaque
-1

Mithilfe des ScriptMethod-Attributs können Sie C # -Methoden auf Codebehind-Seiten so verfügbar machen, dass sie über JavaScript aufgerufen werden können .

Sie können JavaScript nicht von einem CodeBehind aus aufrufen - dieser Code ist ausschließlich auf dem Client vorhanden.

Josh Kodroff
quelle