Вызов функции JavaScript из CodeBehind
Может ли кто-нибудь привести хорошие примеры вызова функции JavaScript из CodeBehind и наоборот?
18 ответов
Вы можете попробовать это:
Page.ClientScript.RegisterStartupScript(this.GetType(),"CallMyFunction","MyFunction()",true);
Вызов функции JavaScript из кода позади
Шаг 1 Добавьте свой код Javascript
<script type="text/javascript" language="javascript">
function Func() {
alert("hello!")
}
</script>
Шаг 2 Добавьте 1 диспетчер скриптов в веб-форму и добавьте кнопку 1
Шаг 3 Добавьте этот код в событие нажатия кнопки
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", "Func()", true);
C# для JavaScript: вы можете зарегистрировать блок скрипта для запуска на странице, как показано ниже:
ClientScript.RegisterStartupScript(GetType(),"hwa","alert('Hello World');",true);
замещать alert()
расстаться с именем вашей функции.
Для вызова метода C# из JavaScript вы можете использовать ScriptManager
или же jQuery
, Я лично пользуюсь jQuery
, Вам нужно украсить метод, который вы хотите вызвать из JavaScript с WebMethod
приписывать. Для получения дополнительной информации о вызове метода C# (называется PageMethod
) от jQuery
Вы можете сослаться на пост Дэйва Уорда.
Если вам нужно отправить значение в качестве параметра.
string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);
Вы не можете сделать это напрямую. Javascript интерпретируется браузером, а C# - сервером. То, что вы можете сделать, чтобы вызвать метод с сервера, используя javscript, это
- использовать webmethod в качестве атрибута в целевых методах.
- добавить параметр 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: добавление скрипт-менеджера на страницу
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
Шаг 3: вызов метода с использованием JavaScript
function GetProductsByCategoryID(categoryID)
{
PageMethods.GetProducts(categoryID, OnGetProductsComplete);
}
Чтобы вызвать функцию javascript с сервера, вы можете использовать RegisterStartipScript:
ClientScript.RegisterStartupScript(GetType(),"id","callMyJSFunction()",true);
Другая вещь, которую вы можете сделать, - создать переменную сеанса, которая будет установлена в коде, затем проверить состояние этой переменной и затем запустить ваш javascript. Хорошо, что это позволит вам запускать сценарий именно там, где вы хотите, вместо того, чтобы выяснять, хотите ли вы, чтобы он выполнялся в DOM или глобально.
Примерно так: Код позади:
Session["newuser"] = "false"
В JavaScript
var newuser = '<%=Session["newuser"]%>';
if (newuser == "yes")
startTutorial();
Вы можете использовать литерал:
this.Controls.Add(new LiteralControl("<script type='text/javascript'>myFunction();</script>"));
Ты не можешь. Codebehind работает на сервере, в то время как JavaScript работает на клиенте.
Тем не менее, вы можете добавить <script type="text/javascript">someFunction();</script>
в ваш вывод и, таким образом, вызвать функцию JS, когда браузер анализирует вашу разметку.
Рабочий пример:_
<%@ 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);
}
}
}
Возможные подводные камни:-
- Код и HTML могут не находиться в одном пространстве имен
CodeBehind="History.aspx.cs"
указывает на неправильную страницу- Функция JS имеет некоторую ошибку
Попробуйте это в Code Behind, и это будет работать на 100%
string script = "window.onload = function() { YourJavaScriptFunctionName(); };";
ClientScript.RegisterStartupScript(this.GetType(), "YourJavaScriptFunctionName", script, true);
IIRC Code Behind компилируется на стороне сервера, а javascript интерпретируется на стороне клиента. Это означает, что нет прямой связи между ними.
С другой стороны, вы можете сделать так, чтобы клиент и сервер общались через отличный инструмент под названием AJAX. http://en.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML
ScriptManager.RegisterStartupScript(this, this.Page.GetType(),"updatePanel1Script", "javascript:ConfirmExecute()",true/>
Я заметил, что многие ответы здесь используют 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
ScriptManager.RegisterStartupScript(Page, GetType(), "JavaFunction", "AlertError();", true);
достаточно использовать вашу функцию
Вот как я это сделал.
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>";
Это работает для меня
object Json_Object=maintainerService.Convert_To_JSON(Jobitem);
ScriptManager.RegisterClientScriptBlock(this,GetType(), "Javascript", "SelectedJobsMaintainer("+Json_Object+"); ",true);
Вы можете предоставить методы C# на страницах с кодовым названием для вызова через JavaScript с помощью атрибута ScriptMethod.
Вы не можете вызывать JavaScript из CodeBehind - этот код существует исключительно на клиенте.
Так как я не мог найти решение, которое было за кодом, которое включает в себя попытку ClientScript
а также ScriptManager
Как сказал Мутаник и Орландо Эррера в этом вопросе (оба они почему-то потерпели неудачу), я предложу интерфейсное решение, которое использует нажатия кнопок для других, если они находятся в том же положении, что и я. Это сработало для меня:
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;"
Поблагодарите "Лико", просто добавьте комментарий к его ответу.
string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);
Добавлены одинарные кавычки ('
) в переменную, иначе появится сообщение об ошибке:
string jsFunc = "myFunc('" + MyBackValue + "')";
Я использовал ScriptManager в Code Behind, и он работал нормально.
ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "CallMyFunction", "confirm()", true);
Если вы используете UpdatePanel в ASP Frontend. Затем введите имя UpdatePanel и "имя функции", определенные тегами сценария.
Вы не можете вызвать функцию Javascript из CodeBehind, потому что файл CodeBehind содержит код, который выполняет серверную часть на веб-сервере. Код Javascript выполняется в веб-браузере на стороне клиента.