Appel de la fonction JavaScript à partir de CodeBehind

150

Quelqu'un peut-il fournir de bons exemples d'appels d'une fonction JavaScript à partir de CodeBehind et vice-versa?

ssmsnet
la source
Voici l'article détaillé codepedia.info/… utilisant avec et sans Ajax Update Panel
Satinder singh

Réponses:

206

Vous pouvez essayer ceci:

Page.ClientScript.RegisterStartupScript(this.GetType(),"CallMyFunction","MyFunction()",true);
mutanique
la source
41
J'irais pour le ScriptManager.RegisterStartupScript (Page, typeof (Page), "somekey", script, true); approche. Cela fonctionne également pendant les publications partielles.
rdmptn
10
1. Parfois, il Page.ClientScript.RegisterClientScriptBlockest nécessaire de consulter ce post pour plus d'informations . 2. Il peut être intéressant de mentionner que pour que MyFunction () fonctionne, MyFunction () doit être défini avant les balises de formulaire ou à l'intérieur de celles-ci, mais PAS après la balise de fin </form> (sinon, une erreur attendue Object sera se produire)
BornToCode
2
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "text", "openDep()", true);travaux. this.GetType()jette une erreur pour moi.
SearchForKnowledge
2
Cela ne fonctionne pas lorsque le code encapsulé avec asp:UpdatePanelet écrit dans un événement de bouton. Ce qui provoque la publication de la page.
Senura Dissanayake
52

C # à JavaScript: vous pouvez enregistrer un bloc de script à exécuter sur la page comme suit:

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

remplacez la alert()pièce par le nom de votre fonction.

Pour appeler la méthode C # à partir de JavaScript, vous pouvez utiliser ScriptManagerou jQuery. J'utilise personnellement jQuery. Vous devez décorer la méthode que vous souhaitez appeler à partir de JavaScript avec un WebMethodattribut. Pour plus d'informations sur l'appel de la méthode C # (appelée PageMethod) à partir de, jQueryvous pouvez vous référer à l'article de Dave Ward .

TheVillageIdiot
la source
51

Appel d'une fonction JavaScript à partir du code derrière

Étape 1 Ajoutez votre code Javascript

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

Étape 2 Ajouter 1 Gestionnaire de scripts dans votre Webform et Ajouter 1 bouton trop

Étape 3 Ajoutez ce code dans votre événement de clic de bouton

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", "Func()", true);
Orlando Herrera
la source
Lorsque vous essayez de le faire lorsqu'un utilisateur clique sur une ligne GridView, cela ne fonctionne que lorsque vous utilisez ScriptManagercomme dans cette réponse, pas Page.ClientScriptcomme dans d'autres réponses. Peut être lié au asp:UpdatePanelcommentaire sous la réponse acceptée.
Chris
16

Vous ne pouvez pas faire cela directement. Dans les WebForms standard, JavaScript est interprété par le navigateur et C # par le serveur. Ce que vous pouvez faire pour appeler une méthode à partir d'un serveur à l'aide de JavaScript est.

Comme ça:

Étape 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 
    }

Étape 2: Ajout d'un ScriptManagersur lePage

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

Étape 3: Appel de la méthode à l'aide de JavaScript

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

Jetez un œil à ce lien.

Pour appeler une fonction JavaScript à partir du serveur, vous pouvez utiliser RegisterStartupScript:

ClientScript.RegisterStartupScript(GetType(),"id","callMyJSFunction()",true);
Vismari
la source
Où placez-vous la première étape dans la hiérarchie des fichiers MVC 3?
Rob
@Rob La GetProducts()fonction est juste une fonction code-behind qui vivrait dans un contrôleur dans une application MVC, de sorte que les balises s'ajoutent à la fonction que vous souhaitez mettre dans un contrôleur que vous avez l'intention d'appeler à partir de JavaScript .
vapcguy
15

Si vous devez envoyer une valeur en tant que paramètre.

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

Une autre chose que vous pouvez faire est de créer une variable de session qui est définie dans le code derrière, puis de vérifier l'état de cette variable, puis d'exécuter votre javascript. La bonne chose est que cela vous permettra d'exécuter votre script là où vous le souhaitez au lieu d'avoir à déterminer si vous voulez qu'il s'exécute dans le DOM ou globalement.

Quelque chose comme ceci: Code derrière:

Session["newuser"] = "false" 

En javascript

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

Vous ne pouvez pas. Codebehind s'exécute sur le serveur tandis que JavaScript s'exécute sur le client.

Cependant, vous pouvez ajouter <script type="text/javascript">someFunction();</script>à votre sortie et ainsi provoquer l'appel de la fonction JS lorsque le navigateur analyse votre balisage.

ThiefMaster
la source
65
"Vous ne pouvez pas. Mais voici comment vous le faites."
3
Je ne considérerais pas cela d'appeler une méthode à partir du code côté serveur car vous n'avez pas de moyen réel d'obtenir une valeur de retour ou de spécifier un rappel.
ThiefMaster
8
Oh, bien sûr que vous pouvez. Vous pouvez appeler une publication à partir de votre javascript ou AJAX n'importe quoi. Je pensais que ce était drôle; J'ai tendance à faire la même chose - "Non, c'est impossible. Personne ne voudrait même faire ça s'il le pouvait." puis quelques minutes plus tard "Alors, voici comment nous allons le faire."
7

Vous pouvez utiliser littéralement:

this.Controls.Add(new LiteralControl("<script type='text/javascript'>myFunction();</script>"));
Dilip Kumar Yadav
la source
1
Mais cela n'ajoute-t-il pas simplement un script en mémoire, il ne l'exécute pas aussi?
Fandango68
5

IIRC Code Behind est compilé côté serveur et javascript est interprété côté client. Cela signifie qu'il n'y a pas de lien direct entre les deux.

Ce que vous pouvez faire d'autre part, c'est faire communiquer le client et le serveur via un outil astucieux appelé AJAX. http://en.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML

Berry Ligtermoet
la source
5

Essayez ceci dans Code Behind et cela fonctionnera à 100%

Écrivez cette ligne de code dans votre fichier Code Behind

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

Et voici la page de formulaire Web

<script type="text/javascript">
    function YourJavaScriptFunctionName() {
        alert("Test!")
    }
</script>
Chandan Kumar
la source
4
ScriptManager.RegisterStartupScript(this, this.Page.GetType(),"updatePanel1Script", "javascript:ConfirmExecute()",true/>
Applications Tawale
la source
8
Ajouter une explication
ketan
4

Exemple de travail: _

<%@ 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 derrière

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

    }
}

Pièges possibles: -

  1. Le code et le HTML peuvent ne pas être dans le même espace de noms
  2. CodeBehind="History.aspx.cs" pointe vers la mauvaise page
  3. La fonction JS a une erreur
Hitesh Sahu
la source
3

J'ai remarqué que beaucoup de réponses ici sont utilisées ScriptManager.RegisterStartupScriptet si vous voulez le faire, ce n'est pas la bonne façon de le faire. La bonne façon est d'utiliser ScriptManager.RegisterScriptBlock([my list of args here]). La raison en est que vous ne devriez utiliser RegisterStartupScript que lorsque votre page se charge (d'où le nom RegisterStartupScript).

Dans VB.NET:

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

en C #:

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

Bien sûr, j'espère qu'il va sans dire que vous devez remplacer la clé par votre identifiant de clé et que vous devriez probablement déplacer tout cela dans un sous / fonction / méthode et passer la clé et certainsJavascriptObject (si votre méthode javascript nécessite que votre argument soit un objet javascript).

Documents MSDN:

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

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

utiliser votre fonction suffit

roi sadique
la source
2
Pouvez-vous expliquer votre réponse un peu plus?
maxpaj
1
Quel est ce paramètre "JavaFunction"? Pouvons-nous y ajouter quelque chose? Que faut-il avoir dans cet argument?
Senura Dissanayake
1
@SenuraDissanayake C'est un titre-oui, ça peut être n'importe quoi et ça n'a pas vraiment d'importance.
vapcguy
2

Voilà comment je l'ai fait.

Le balisage HTML montrant une étiquette et un contrôle de bouton est le suivant.

<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 fonction JavaScript est ici.

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

Le code derrière pour déclencher la fonction JavaScript est ici.

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

cela fonctionne pour moi

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

Comme je ne pouvais pas trouver une solution qui était derrière le code, ce qui inclut d'essayer le ClientScriptet ScriptManagercomme mutanic et Orlando Herrera a dit dans cette question (ils ont tous les deux échoué), je vais proposer une solution frontale qui utilise des clics de bouton à d'autres si ils sont dans la même position que moi. Cela a fonctionné pour moi:

Balisage HTML:

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

JavaScript:

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

J'utilise simplement un bouton ASP.NET qui utilise la OnClientClickpropriété, qui déclenche des fonctions de script côté client, c'est-à-dire JavaScript. Les éléments clés à noter ici sont les utilisations du returnmot - clé dans l'appel de fonction et dans la fonction elle-même. J'ai lu des documents qui n'utilisent pas returnmais que le bouton clique toujours pour fonctionner - cela n'a pas fonctionné pour moi. L' return false;instruction dans la fonction spécifie qu'une publication ne doit PAS se produire. Vous pouvez également utiliser cette instruction dans la OnClientClickpropriété:OnClientClick="myFunction() return false;"

Max Voisard
la source
0

J'ai utilisé ScriptManager dans Code Behind et cela a bien fonctionné.

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

Si vous utilisez UpdatePanel dans ASP Frontend. Ensuite, entrez le nom UpdatePanel et le 'nom de la fonction' définis avec des balises de script.

Ravi Agrawal
la source
0

Merci "Liko", ajoutez simplement un commentaire à sa réponse.

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

Ajout de guillemets simples ( ') à la variable, sinon cela donnera un message d'erreur:

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

Vous ne pouvez pas appeler une fonction Javascript à partir de CodeBehind, car le fichier CodeBehind contient le code qui s'exécute côté serveur sur le serveur Web. Le code Javascript s'exécute dans le navigateur Web côté client.

Charlie Kilian
la source
1
Vous ne pouvez pas appeler une fonction javascript directement comme dans myCoolJavascriptFunction (javascriptFunctionArgs); sur le serveur, mais vous pouvez appeler une fonction javascript à partir du code derrière dans une page WebForms.
cr1pto
d'accord avec cloudstrifebro
Khurram Ishaque
-1

Vous pouvez exposer les méthodes C # sur les pages codebehind pour qu'elles puissent être appelées via JavaScript à l'aide de l' attribut ScriptMethod .

Vous ne pouvez pas appeler JavaScript à partir d'un CodeBehind - ce code existe uniquement sur le client.

Josh Kodroff
la source