Chiamata della funzione JavaScript da CodeBehind


Risposte:


206

Puoi provare questo:

Page.ClientScript.RegisterStartupScript(this.GetType(),"CallMyFunction","MyFunction()",true);

41
Vorrei scegliere ScriptManager.RegisterStartupScript (Pagina, typeof (Pagina), "somekey", script, true); approccio. Funziona anche durante i postback parziali.
rdmptn,

10
1. A volte Page.ClientScript.RegisterClientScriptBlockè necessario invece vedere questo post per informazioni . 2. Vale la pena ricordare che per far funzionare MyFunction (), MyFunction () deve essere definito prima dei tag del modulo o al loro interno, ma NON dopo il tag di chiusura </form> (altrimenti un errore previsto dell'oggetto si verifica)
BornToCode

2
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "text", "openDep()", true);lavori. this.GetType()genera un errore per me.
SearchForKnowledge

2
Questo non funziona quando il codice è racchiuso tra un asp:UpdatePanele scritto in un evento pulsante. Ciò provoca il postback della pagina.
Senura Dissanayake,

52

C # su JavaScript: puoi registrare il blocco di script da eseguire sulla pagina come segue:

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

sostituire la alert()parte con il nome della funzione.

Per chiamare il metodo C # da JavaScript puoi usare ScriptManagero jQuery. Io personalmente uso jQuery. È necessario decorare il metodo che si desidera chiamare da JavaScript con WebMethodattributo. Per ulteriori informazioni sulla chiamata del metodo C # (chiamato PageMethod) da jQueryte, puoi fare riferimento al post di Dave Ward .


51

Chiamare una funzione JavaScript dal codice dietro

Passaggio 1 Aggiungi il tuo codice Javascript

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

Step 2 Aggiungere 1 Gestore script nella vostra WebForm e aggiungere 1 pulsante di troppo

Passaggio 3 Aggiungere questo codice nell'evento clic pulsante

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", "Func()", true);

Quando si tenta di farlo quando si fa clic su una riga GridView, funziona solo quando si utilizza ScriptManagercome in questa risposta, non Page.ClientScriptcome in altre risposte. Potrebbe essere correlato al asp:UpdatePanelcommento sotto la risposta accettata.
Chris,

16

Non puoi farlo direttamente. In WebForm standard JavaScript è interpretato dal browser e C # dal server. Quello che puoi fare per chiamare un metodo dal server usando JavaScript è.

Come questo:

Passo 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 
    }

Passaggio 2: aggiunta di a ScriptManagersuPage

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

Passaggio 3: chiamare il metodo utilizzando JavaScript

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

Dai un'occhiata a questo link.

Per chiamare una funzione JavaScript dal server è possibile utilizzare RegisterStartupScript:

ClientScript.RegisterStartupScript(GetType(),"id","callMyJSFunction()",true);

Dove collochi il passaggio 1 nella gerarchia dei file MVC 3?
Rob,

@Rob La GetProducts()funzione è solo una funzione code-behind che risiederebbe in un controller in un'app MVC, quindi i tag vanno al di sopra di qualunque funzione tu voglia inserire in un controller che intendi chiamare da JavaScript .
vapcguy,

15

Se è necessario inviare un valore come parametro.

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

8

Un'altra cosa che potresti fare è creare una variabile di sessione che viene impostata nel codice dietro e quindi controllare lo stato di quella variabile e quindi eseguire il tuo javascript. La cosa buona è che questo ti permetterà di eseguire il tuo script proprio dove vuoi invece di dover capire se vuoi che venga eseguito nel DOM o globalmente.

Qualcosa del genere: Codice dietro:

Session["newuser"] = "false" 

In javascript

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

7

Non puoi. Codebehind è in esecuzione sul server mentre JavaScript è in esecuzione sul client.

Tuttavia, è possibile aggiungere <script type="text/javascript">someFunction();</script>all'output e quindi chiamare la funzione JS quando il browser analizza il markup.


65
"Non puoi. Ma ecco come lo fai."

3
Non prenderei in considerazione l'idea di chiamare un metodo dal codice lato server poiché non hai un modo reale per ottenere un valore di ritorno o specificare un callback.
ThiefMaster,

8
Aw, certo che puoi. Puoi richiamare qualsiasi postback dal tuo javascript o AJAX. Ho pensato che fosse divertente; Tendo a fare la stessa cosa: "No, è impossibile. Nessuno lo vorrebbe nemmeno se potesse." poi qualche minuto dopo "Quindi ecco come lo faremo."

7

Puoi usare letterale:

this.Controls.Add(new LiteralControl("<script type='text/javascript'>myFunction();</script>"));

1
Ma questo non aggiunge semplicemente uno script in memoria, in realtà non lo esegue anche?
Fandango68,


5

Prova questo in Code Behind e funzionerà al 100%

Scrivi questa riga di codice nel file Code Behind

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

E questa è la pagina del modulo web

<script type="text/javascript">
    function YourJavaScriptFunctionName() {
        alert("Test!")
    }
</script>

4
ScriptManager.RegisterStartupScript(this, this.Page.GetType(),"updatePanel1Script", "javascript:ConfirmExecute()",true/>

8
Aggiungi una spiegazione
ketan,

4

Esempio di lavoro: _

<%@ 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>

Codice dietro

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);
        }

    }
}

Possibili insidie: -

  1. Codice e HTML potrebbero non essere nello stesso spazio dei nomi
  2. CodeBehind="History.aspx.cs" punta a una pagina sbagliata
  3. La funzione JS sta avendo qualche errore

3

Ho notato che molte delle risposte qui stanno usando ScriptManager.RegisterStartupScripte se hai intenzione di farlo, non è il modo giusto di farlo. Il modo giusto è usare ScriptManager.RegisterScriptBlock([my list of args here]). Il motivo è che dovresti usare RegisterStartupScript solo quando la tua pagina viene caricata (da qui il nome 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);

Naturalmente, spero che sia ovvio che devi sostituire la chiave con il tuo identificatore di chiave e probabilmente dovresti spostare tutto questo in un sub / funzione / metodo e passare la chiave e un po 'di JavaScript (se il tuo metodo javascript richiede che il tuo arg sia un oggetto javascript).

Documenti MSDN:

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


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

usare la tua funzione è sufficiente


2
Puoi spiegare un po 'di più la tua risposta?
maxpaj,

1
Che cos'è questo parametro "JavaFunction"? Possiamo aggiungere qualcosa? Cosa deve avere in tale argomento?
Senura Dissanayake,

1
@SenuraDissanayake È un titolo-sì, può essere qualsiasi cosa e non importa.
vapcguy,

2

È così che l'ho fatto.

Il markup HTML che mostra un'etichetta e un controllo pulsante è il seguente.

<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>

La funzione JavaScript è qui.

<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>

Il codice dietro per attivare la funzione JavaScript è qui.

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

1

questo funziona per me

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

1

Dal momento che non riuscivo a trovare una soluzione che fosse il codice dietro, che include provare il ClientScripteScriptManager come mutanic e Orlando Herrera ha detto in questa domanda (entrambi in qualche modo fallito), io offrire una soluzione front-end che utilizza i clic sui pulsanti per gli altri se sono nella mia stessa posizione. Questo ha funzionato per me:

Markup HTML:

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

JavaScript:

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

Sto semplicemente usando un pulsante ASP.NET che utilizza la OnClientClickproprietà, che attiva le funzioni di scripting sul lato client, ovvero JavaScript. Le cose chiave da notare qui sono gli usi della returnparola chiave nella chiamata di funzione e nella funzione stessa. Ho letto documenti che non usano returnma che fanno comunque funzionare il pulsante, in qualche modo non ha funzionato per me. L' return false;istruzione nella funzione specifica che un postback NON dovrebbe accadere. È inoltre possibile utilizzare tale istruzione nella OnClientClickproprietà:OnClientClick="myFunction() return false;"


0

Ho usato ScriptManager in Code Behind e ha funzionato bene.

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

Se si utilizza UpdatePanel in ASP Frontend. Quindi, inserisci il nome UpdatePanel e il 'nome funzione' definito con i tag di script.


0

Grazie "Liko", basta aggiungere un commento alla sua risposta.

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

Aggiunte virgolette singole ( ') alla variabile, altrimenti verrà visualizzato un messaggio di errore:

string jsFunc = "myFunc('" + MyBackValue + "')";

-1

Non è possibile chiamare una funzione Javascript da CodeBehind, poiché il file CodeBehind contiene il codice che esegue il lato server sul server Web. Il codice Javascript viene eseguito nel browser Web sul lato client.


1
Non puoi chiamare una funzione javascript direttamente come in myCoolJavascriptFunction (javascriptFunctionArgs); sul server, ma puoi chiamare una funzione javascript dal codice dietro in una pagina WebForms.
cr1pto

d'accordo con cloudstrifebro
Khurram Ishaque l'

-1

È possibile esporre i metodi C # sulle pagine codebehind per essere richiamabili tramite JavaScript utilizzando l' attributo ScriptMethod .

Non puoi chiamare JavaScript da un CodeBehind - quel codice esiste solo sul client.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.