Wywołanie funkcji JavaScript z CodeBehind

150

Czy ktoś może podać dobre przykłady wywoływania funkcji JavaScript z CodeBehind i odwrotnie?

ssmsnet
źródło
Oto szczegółowy artykuł codepedia.info/ ... używanie z panelem aktualizacji Ajax i bez
Satinder singh

Odpowiedzi:

206

Możesz spróbować tego:

Page.ClientScript.RegisterStartupScript(this.GetType(),"CallMyFunction","MyFunction()",true);
mutaniczny
źródło
41
Wybrałbym ScriptManager.RegisterStartupScript (Page, typeof (Page), "somekey", script, true); podejście. Działa również podczas częściowych ogłoszeń zwrotnych.
rdmptn
10
1. Czasami Page.ClientScript.RegisterClientScriptBlockjest wymagane zamiast tego zobacz ten post w celu uzyskania informacji . 2. Warto wspomnieć, że aby funkcja MyFunction () działała, funkcja MyFunction () musi być zdefiniowana przed tagami formularza lub wewnątrz nich, ale NIE po znaczniku końcowym </form> (w przeciwnym razie oczekiwany błąd Object będzie występują)
BornToCode
2
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "text", "openDep()", true);Pracuje. this.GetType()rzuca mi błąd.
SearchForKnowledge
2
To nie działa, gdy kod jest opakowany asp:UpdatePaneli zapisany w zdarzeniu przycisku. Co powoduje, że strona ogłasza zwrotną.
Senura Dissanayake
52

C # do JavaScript: możesz zarejestrować blok skryptu do uruchomienia na stronie, jak poniżej:

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

zastąp alert()część nazwą swojej funkcji.

Aby wywołać metodę C # z JavaScript, możesz użyć ScriptManagerlub jQuery. Osobiście używam jQuery. Musisz ozdobić metodę, którą chcesz wywołać z JavaScript, WebMethodatrybutem. Więcej informacji na temat wywoływania metody C # (wywoływanej PageMethod) z jQuerymożna znaleźć w poście Dave'a Warda .

TheVillageIdiot
źródło
51

Wywołanie funkcji JavaScript z tyłu kodu

Krok 1 Dodaj swój kod JavaScript

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

Krok 2 Dodać 1 Menedżer skryptów w swojej Webform i dodać 1 przycisk zbyt

Krok 3 Dodaj ten kod do zdarzenia kliknięcia przycisku

ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", "Func()", true);
Orlando Herrera
źródło
Próbując to zrobić, gdy zostanie kliknięty wiersz GridView, działa to tylko wtedy, gdy jest używany ScriptManagerw tej odpowiedzi, a nie Page.ClientScriptjak w innych odpowiedziach. Może być powiązany z asp:UpdatePanelkomentarzem pod zaakceptowaną odpowiedzią.
Chris
16

Nie możesz tego zrobić bezpośrednio. W standardowych formularzach WebForm JavaScript jest interpretowany przez przeglądarkę, a C # przez serwer. To, co możesz zrobić, aby wywołać metodę z serwera za pomocą JavaScript, to.

Lubię to:

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

Etap 2: Dodawanie ScriptManagernaPage

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

Krok 3: Wywołanie metody za pomocą JavaScript

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

Spójrz na ten link.

Aby wywołać funkcję JavaScript z serwera możesz użyć RegisterStartupScript:

ClientScript.RegisterStartupScript(GetType(),"id","callMyJSFunction()",true);
Vismari
źródło
Gdzie umieszczasz pierwszy krok w hierarchii plików MVC 3?
Rob
@Rob Ta GetProducts()funkcja jest po prostu funkcją związaną z kodem, która będzie znajdować się w kontrolerze w aplikacji MVC, więc tagi znajdują się na wierzchu dowolnej funkcji, którą chcesz umieścić w kontrolerze, który zamierzasz wywołać z JavaScript .
vapcguy
15

Jeśli chcesz wysłać wartość jako parametr.

string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);
Liko
źródło
8

Inną rzeczą, którą możesz zrobić, jest utworzenie zmiennej sesji, która jest ustawiana w kodzie za nią, a następnie sprawdzenie stanu tej zmiennej i uruchomienie javascript. Dobrą rzeczą jest to, że pozwoli ci to uruchomić skrypt dokładnie tam, gdzie chcesz, zamiast zastanawiać się, czy chcesz, aby działał w DOM, czy globalnie.

Coś takiego: Kod za:

Session["newuser"] = "false" 

W javascript

var newuser = '<%=Session["newuser"]%>';
 if (newuser == "yes")
     startTutorial();  
Prakash Joshi
źródło
7

Nie możesz. Codebehind działa na serwerze, podczas gdy JavaScript jest uruchomiony na kliencie.

Możesz jednak dodać coś <script type="text/javascript">someFunction();</script>do swojego wyniku i w ten sposób wywołać funkcję JS, gdy przeglądarka analizuje Twoje znaczniki.

ThiefMaster
źródło
65
- Nie możesz. Ale oto jak to robisz.
3
Nie rozważałbym tego wywoływania metody z kodu po stronie serwera, ponieważ nie masz prawdziwego sposobu na uzyskanie wartości zwracanej lub określenie wywołania zwrotnego.
ThiefMaster
8
Oczywiście, że możesz. Możesz oddzwonić z powrotem ze swojego javascript lub AJAX. Myślałem, że to było zabawne; Zwykle robię to samo - „Nie, to niemożliwe. Nikt nawet nie chciałby tego zrobić, gdyby mógł”. potem kilka minut później "Więc oto jak zamierzamy to zrobić."
7

Możesz użyć dosłownego:

this.Controls.Add(new LiteralControl("<script type='text/javascript'>myFunction();</script>"));
Dilip Kumar Yadav
źródło
1
Ale czy to nie dodaje skryptu do pamięci, tak naprawdę go nie uruchamia?
Fandango68
5

Kod IIRC jest skompilowany po stronie serwera, a javascript jest interpretowany po stronie klienta. Oznacza to, że nie ma bezpośredniego związku między nimi.

Z drugiej strony możesz komunikować się między klientem a serwerem za pomocą sprytnego narzędzia o nazwie AJAX. http://en.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML

Berry Ligtermoet
źródło
5

Wypróbuj to w Code Behind i zadziała w 100%

Napisz tę linię kodu w swoim pliku Code Behind

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

A to jest strona formularza internetowego

<script type="text/javascript">
    function YourJavaScriptFunctionName() {
        alert("Test!")
    }
</script>
Chandan Kumar
źródło
4
ScriptManager.RegisterStartupScript(this, this.Page.GetType(),"updatePanel1Script", "javascript:ConfirmExecute()",true/>
Apps Tawale
źródło
8
Dodaj wyjaśnienie
ketan
4

Przykład roboczy: _

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

Kod za

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

    }
}

Możliwe pułapki: -

  1. Kod i HTML mogą nie znajdować się w tej samej przestrzeni nazw
  2. CodeBehind="History.aspx.cs" wskazuje na niewłaściwą stronę
  3. Funkcja JS ma jakiś błąd
Hitesh Sahu
źródło
3

Zauważyłem, że wiele odpowiedzi tutaj używa ScriptManager.RegisterStartupScripti jeśli masz zamiar to zrobić, nie jest to właściwy sposób. Właściwy sposób to użycie ScriptManager.RegisterScriptBlock([my list of args here]). Powodem jest to, że powinieneś używać RegisterStartupScript tylko podczas ładowania strony (stąd nazwa RegisterStartupScript).

W VB.NET:

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

w C #:

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

Oczywiście mam nadzieję, że jest rzeczą oczywistą, że musisz zastąpić klucz swoim identyfikatorem klucza i prawdopodobnie powinieneś przenieść to wszystko do sub / funkcji / metody i przekazać klucz i jakiś obiekt JavascriptObject (jeśli twoja metoda javascript wymaga, aby twój argument był obiekt javascript).

Dokumentacja MSDN:

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

cr1pto
źródło
3
ScriptManager.RegisterStartupScript(Page, GetType(), "JavaFunction", "AlertError();", true);

użycie Twojej funkcji jest wystarczające

sadystyczny król
źródło
2
Czy możesz dokładniej wyjaśnić swoją odpowiedź?
maxpaj
1
Co to jest parametr „JavaFunction”? Czy możemy coś do tego dodać? Co musi mieć w tej kłótni?
Senura Dissanayake
1
@SenuraDissanayake To tytuł - tak, może to być wszystko i nie ma znaczenia.
vapcguy
2

Tak to zrobiłem.

Kod HTML przedstawiający kontrolkę etykiety i przycisku jest następujący.

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

Funkcja JavaScript jest tutaj.

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

Kod wywołujący funkcję JavaScript jest tutaj.

lblJavaScript.Text = "<script type='text/javascript'>showDialogue();</script>";
evaaggy
źródło
1

to działa dla mnie

object Json_Object=maintainerService.Convert_To_JSON(Jobitem);
ScriptManager.RegisterClientScriptBlock(this,GetType(), "Javascript", "SelectedJobsMaintainer("+Json_Object+"); ",true);
Kirk Patrick Brown
źródło
1

Ponieważ nie mogłem znaleźć rozwiązania, które było za kodem, co obejmuje wypróbowanie ClientScripti ScriptManagerpodobne do mutanic, a Orlando Herrera powiedział w tym pytaniu (obaj jakoś zawiedli), zaoferuję innym rozwiązanie front-end, które wykorzystuje kliknięcia przycisków, jeśli są w tej samej pozycji co ja. To zadziałało dla mnie:

Znaczniki HTML:

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

JavaScript:

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

Po prostu używam przycisku ASP.NET, który wykorzystuje OnClientClickwłaściwość, która uruchamia funkcje skryptowe po stronie klienta, czyli JavaScript. Najważniejsze rzeczy, na które należy zwrócić uwagę, to użycie returnsłowa kluczowego w wywołaniu funkcji oraz w samej funkcji. Przeczytałem dokumenty, które nie używają, returnale przycisk kliknięcia nadal działa - jakoś to nie zadziałało dla mnie. return false;Oświadczenie w funkcji określa odświeżenie strony nie powinno się zdarzyć. Możesz również użyć tego oświadczenia we OnClientClickwłaściwości:OnClientClick="myFunction() return false;"

Max Voisard
źródło
0

Użyłem ScriptManagera w Code Behind i działało dobrze.

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

Jeśli używasz UpdatePanel w ASP Frontend. Następnie wprowadź nazwę UpdatePanel i „nazwę funkcji” zdefiniowane za pomocą tagów skryptu.

Ravi Agrawal
źródło
0

Dziękuję "Liko", po prostu dodaj komentarz do jego odpowiedzi.

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

Dodano apostrofy ( ') do zmiennej, w przeciwnym razie wyświetli się komunikat o błędzie:

string jsFunc = "myFunc('" + MyBackValue + "')";
Stephen
źródło
-1

Nie można wywołać funkcji Javascript z CodeBehind, ponieważ plik CodeBehind zawiera kod, który wykonuje po stronie serwera na serwerze sieci Web. Kod JavaScript jest wykonywany w przeglądarce internetowej po stronie klienta.

Charlie Kilian
źródło
1
Nie można wywołać funkcji javascript bezpośrednio, tak jak w myCoolJavascriptFunction (javascriptFunctionArgs); na serwerze, ale możesz wywołać funkcję javascript z kodu znajdującego się za stroną WebForms.
cr1pto
zgodził się z cloudstrifebro
Khurram Ishaque.
-1

Można uwidocznić metody C # na stronach za kodem, aby można je było wywołać za pomocą języka JavaScript przy użyciu atrybutu ScriptMethod .

Nie możesz wywołać JavaScript z CodeBehind - ten kod istnieje wyłącznie na kliencie.

Josh Kodroff
źródło