Вызов функции JavaScript из CodeBehind

150

Может ли кто-нибудь привести хорошие примеры вызова функции JavaScript из CodeBehind и наоборот?

ssmsnet
источник
Вот подробная статья codepedia.info/… с использованием панели обновления Ajax и без нее
Satinder singh

Ответы:

206

Вы можете попробовать это:

Page.ClientScript.RegisterStartupScript(this.GetType(),"CallMyFunction","MyFunction()",true);
mutanic
источник
41
Я хотел бы пойти для ScriptManager.RegisterStartupScript (Page, typeof (Page), «somekey», script, 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 # для JavaScript: вы можете зарегистрировать блок скрипта для запуска на странице, как показано ниже:

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

замените alert()деталь именем вашей функции.

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

TheVillageIdiot
источник
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);
Vismari
источник
Где вы размещаете первый шаг в файловой иерархии MVC 3?
Роб
@Rob GetProducts()Функция - это просто функция с выделенным кодом, которая будет жить в контроллере в приложении MVC, поэтому теги идут поверх любой функции, которую вы хотите поместить в контроллер, который вы собираетесь вызывать из JavaScript. ,
vapcguy
15

Если вам нужно отправить значение в качестве параметра.

string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);
Liko
источник
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, когда браузер анализирует вашу разметку.

ThiefMaster
источник
65
«Вы не можете. Но вот как вы это делаете».
3
Я не считаю, что вызов метода из серверного кода, так как у вас нет реального способа получить возвращаемое значение или указать обратный вызов.
ThiefMaster
8
Оу, конечно, вы можете. Вы можете позвонить обратно из вашего javascript или AJAX что угодно назад. Я думал, что это было забавно; Я склонен делать то же самое: «Нет, это невозможно. Никто бы даже не захотел сделать это, если бы мог». затем несколько минут спустя «Так вот как мы собираемся это сделать».
7

Вы можете использовать литерал:

this.Controls.Add(new LiteralControl("<script type='text/javascript'>myFunction();</script>"));
Дилип Кумар Ядав
источник
1
Но разве это не просто добавляет скрипт в память, а не запускает его на самом деле?
Fandango68
5

IIRC Code Behind компилируется на стороне сервера, а javascript интерпретируется на стороне клиента. Это означает, что нет прямой связи между ними.

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

Ягода Лигтермут
источник
5

Попробуйте это в Code Behind, и это будет работать на 100%

Напишите эту строку кода в вашем коде позади файла

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

И это страница веб-формы

<script type="text/javascript">
    function YourJavaScriptFunctionName() {
        alert("Test!")
    }
</script>
Чандан Кумар
источник
4
ScriptManager.RegisterStartupScript(this, this.Page.GetType(),"updatePanel1Script", "javascript:ConfirmExecute()",true/>
Apps Tawale
источник
8
Добавьте объяснение
кетан
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);

Конечно, я надеюсь, что само собой разумеется, что вам нужно заменить ключ своим идентификатором ключа и, вероятно, следует переместить все это в sub / function / method и передать key и someJavascriptObject (если ваш метод javascript требует, чтобы ваш arg был объект JavaScript).

Документы MSDN:

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

cr1pto
источник
3
ScriptManager.RegisterStartupScript(Page, GetType(), "JavaFunction", "AlertError();", true);

достаточно использовать вашу функцию

садистский король
источник
2
Можете ли вы объяснить свой ответ немного больше?
maxpaj
1
Что это за параметр "JavaFunction"? Можем ли мы что-нибудь добавить? Что нужно иметь в этом аргументе?
Сенура Диссанаяке
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>";
evaaggy
источник
1

это работает для меня

object Json_Object=maintainerService.Convert_To_JSON(Jobitem);
ScriptManager.RegisterClientScriptBlock(this,GetType(), "Javascript", "SelectedJobsMaintainer("+Json_Object+"); ",true);
Кирк Патрик Браун
источник
1

Так как я не смог найти решение, которое было за кодом, которое включает в себя попытку ClientScriptи ScriptManagerкак mutanic и Орландо Эррера сказал в этом вопросе (они оба почему-то не смогли), я предложу интерфейсное решение, которое использует нажатия кнопок для других, если они в том же положении, что и я. Это сработало для меня:

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
Khurram Ishaque
-1

Вы можете предоставить методы C # на страницах с кодовым названием для вызова через JavaScript с помощью атрибута ScriptMethod .

Вы не можете вызвать JavaScript из CodeBehind - этот код существует исключительно на клиенте.

Джош Кодрофф
источник