Виклик функції JavaScript від CodeBehind


150

Чи може хтось надати хороші приклади виклику функції JavaScript від CodeBehind і навпаки?


Ось детальна стаття codepedia.info/… із використанням панелі оновлень Ajax та без неї
Satinder Singh

Відповіді:


206

Ви можете спробувати це:

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

41
Я б пішов на ScriptManager.RegisterStartupScript (Page, typeof (Page), "Somekey", скрипт, true); підхід. Він працює і під час часткових поштових розсилок.
rdmptn

10
1. Іноді Page.ClientScript.RegisterClientScriptBlockпотрібно натомість переглянути цю публікацію для отримання інформації . 2. Можливо, варто згадати, що для того, щоб MyFunction () працював, MyFunction () повинен бути визначений перед тегами форми або всередині них, але НЕ після тега </form> закінчення (інакше очікувана помилка об'єкта буде відбуваються)
BornToCode

2
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "text", "openDep()", true);працює. this.GetType()кидає помилку для мене.
SearchForKnowledge

2
Це не працює, коли код, обгорнутий asp:UpdatePanelі записаний у події кнопки. Що призводить до повернення сторінки назад.
Сенура Діссанаяке

52

C # to JavaScript: ви можете зареєструвати блок скриптів для запуску на сторінці, як:

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

замініть alert()частину на ім’я функції.

Для виклику методу C # з JavaScript ви можете використовувати ScriptManagerабо jQuery. Я особисто використовую jQuery. Вам потрібно прикрасити метод, який потрібно зателефонувати з JavaScript з WebMethodатрибутом. Для отримання додаткової інформації щодо виклику методу C # (зателефонований PageMethod) jQueryви можете ознайомитися з повідомленням Дейва Варда .


51

Виклик функції JavaScript з коду позаду

Крок 1 Додайте код Javascript

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

Крок 2 Додайте 1 Script Менеджер в вашому WebForm і додайте 1 кнопку надто

Крок 3 Додайте цей код до події натискання кнопки

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

При спробі зробити це, коли натискається рядок GridView, він працює лише при використанні, ScriptManagerяк у цій відповіді, а не Page.ClientScriptв інших відповідях. Можливо, це стосується asp:UpdatePanelкоментаря під прийнятою відповіддю.
Кріс

16

Не можна цього робити безпосередньо. У стандартних WebForms JavaScript інтерпретується браузером, а C # - сервером. Що можна зробити для виклику методу з сервера за допомогою JavaScript.

  • Використовуйте WebMethodяк attributeв цільових методах.
  • Додати ScriptManagerналаштування EnablePageMethodsяк true.
  • Додайте код JavaScript для виклику методів через об’єкт PageMethods.

Подобається це:

Крок 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 
    }

Крок 2: Додавання значка ScriptManagerнаPage

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

Крок 3: Виклик методу за допомогою JavaScript

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

Подивіться за цим посиланням.

Для виклику функції JavaScript з сервера ви можете використовувати RegisterStartupScript:

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

Де ви розмістите перший крок у ієрархії файлів MVC 3?
Роб

@Rob GetProducts()Функція - це лише функція кодування, яка житиме в контролері в додатку MVC, тому теги переходять на верхню частину функції, яку ви хочете ввести в контролер, на який ви хочете зателефонувати з JavaScript .
vapcguy

15

Якщо вам потрібно надіслати значення в якості параметра.

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

8

Інша річ, яку ви можете зробити, - це створити змінну сеансу, яка встановлюється в коді позаду, а потім перевірити стан цієї змінної, а потім запустити Javascript. Хороша річ, що це дозволить запустити сценарій прямо там, де ви хочете, замість того, щоб розібратися, чи хочете ви його запускати в DOM або в усьому світі.

Приблизно так: Код позаду:

Session["newuser"] = "false" 

У JavaScript

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

7

Ви не можете. Codebehind працює на сервері, а JavaScript працює на клієнті.

Однак ви можете додати <script type="text/javascript">someFunction();</script>до свого результату і, таким чином, викликати функцію JS, коли браузер аналізує вашу розмітку.


65
"Ви не можете. Але ось, як це зробити".

3
Я б не вважав, що викликати метод із коду на сервері, оскільки у вас немає реального способу отримати значення повернення або вказати зворотний виклик.
ThiefMaster

8
Авжеж, звичайно. Ви можете зателефонувати за допомогою зворотного зв'язку з JavaScript або AJAX будь-чим назад. Я думав, що це смішно; Я схильний робити те саме - "Ні, це неможливо. Ніхто навіть не хотів би цього зробити, якби міг". потім через кілька хвилин "Отже, ось як ми будемо це робити".

7

Ви можете використовувати буквальне:

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

1
Але це не просто додає скрипт у пам'ять, він насправді не працює також?
Fandango68

5

Код IIRC Ззаду компілюється на сервері, а JavaScript інтерпретується на стороні клієнта. Це означає, що між ними немає прямого зв’язку.

З іншого боку, ви можете зробити так, щоб клієнт і сервер спілкувалися через чудовий інструмент AJAX. http://en.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML


5

Спробуйте це в Code Behind, і це спрацює 100%

Запишіть цей рядок коду у файл Code Behind

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

І це сторінка веб-форми

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


4

Приклад роботи: _

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

Код позаду

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

    }
}

Можливі підводні камені: -

  1. Код і HTML можуть бути не в одному просторі імен
  2. CodeBehind="History.aspx.cs" вказує на неправильну сторінку
  3. Функція JS має деяку помилку

3

Я помітив дуже багато відповідей, які тут використовуються, ScriptManager.RegisterStartupScriptі якщо ви збираєтесь це робити, це не правильний спосіб зробити це. Правильний спосіб - використовувати ScriptManager.RegisterScriptBlock([my list of args here]). Причина полягає в тому, що ви повинні використовувати RegisterStartupScript лише тоді, коли ваша сторінка завантажується (звідси і назва RegisterStartupScript).

У VB.NET:

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

в C #:

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

Звичайно, я сподіваюсь, що само собою зрозуміло, що вам потрібно замінити ключ на ваш ідентифікатор ключа, і, ймовірно, слід перемістити все це в підменю / функцію / метод і передати ключ і someJavascriptObject (якщо ваш метод javascript вимагає, щоб ваш аргумент є об’єкт javascript).

Документи MSDN:

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


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

використання вашої функції достатньо


2
Чи можете ви пояснити свою відповідь трохи більше?
maxpaj

1
Що це за параметр "JavaFunction"? Чи можемо ми додати щось у нього? Що потрібно мати в цьому аргументі?
Senura Dissanayake

1
@SenuraDissanayake Це заголовок, так, це може бути все, що насправді не має значення.
vapcguy

2

Ось як я це зробив.

Розмітка HTML із відображенням мітки та кнопки здійснюється наступним чином.

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

Тут функція JavaScript.

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

Код позаду для запуску функції JavaScript тут.

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

1

це працює для мене

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

1

Оскільки я не зміг знайти рішення, яке було за кодом, що включає спробу ClientScriptіScriptManager як mutanic і Orlando Herrera сказав в цьому питанні (обидва вони як - то чи не вийшло ), я запропонувати фронтальним рішення , яке використовує клацання кнопки для інших , якщо вони в тому ж положенні, що і я. Це працювало для мене:

Розмітка HTML:

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

JavaScript:

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

Я просто використовую кнопку ASP.NET, яка використовує OnClientClickвластивість, яка запускає функції сценаріїв на стороні клієнта, тобто JavaScript. Ключові речі, які слід зазначити тут, - це використання returnключового слова у виклику функції та в самій функції. Я читав документи, які не використовують, returnале все одно запускають натискання кнопки, щоб працювати - якось це не працювало для мене. Оператор return false;у функції вказує, що після зворотного зв'язку НЕ відбудеться. Ви також можете використовувати цю заяву у OnClientClickвласність:OnClientClick="myFunction() return false;"


0

Я використовував ScriptManager в Code Behind, і він працював чудово.

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

Якщо ви використовуєте UpdatePanel в ASP Frontend. Потім введіть ім'я UpdatePanel та "ім'я функції", визначені тегами сценарію.


0

Дякую «Ліко», просто додайте коментар до його відповіді.

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

До 'змінної додано одинарні лапки ( ), інакше воно видасть повідомлення про помилку:

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

-1

Ви не можете викликати функцію Javascript з CodeBehind, оскільки файл CodeBehind містить код, який виконує сторону сервера на веб-сервері. Код Javascript виконується у веб-браузері на стороні клієнта.


1
Ви не можете викликати функцію javascript безпосередньо, як у myCoolJavascriptFunction (javascriptFunctionArgs); на сервері, але ви можете викликати функцію javascript з коду позаду на сторінці WebForms.
cr1pto

домовився з cloudstrifebro
Хуррам Ішак

-1

Ви можете відкрити методи C # на сторінках коду, які можна викликати через JavaScript, використовуючи атрибут ScriptMethod .

Ви не можете зателефонувати на JavaScript із CodeBehind - той код існує виключно у клієнта.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.