【发布时间】:2011-08-09 12:40:50
【问题描述】:
谁能提供从 CodeBehind 调用 JavaScript 函数的好例子,反之亦然?
【问题讨论】:
标签: c# javascript asp.net
谁能提供从 CodeBehind 调用 JavaScript 函数的好例子,反之亦然?
【问题讨论】:
标签: c# javascript asp.net
在后面的代码中试试这个,它会 100% 工作
在你的代码隐藏文件中写这行代码
string script = "window.onload = function() { YourJavaScriptFunctionName(); };";
ClientScript.RegisterStartupScript(this.GetType(), "YourJavaScriptFunctionName", script, true);
这是网页表单页面
<script type="text/javascript">
function YourJavaScriptFunctionName() {
alert("Test!")
}
</script>
【讨论】:
感谢“Liko”,只需在他的回答中添加评论即可。
string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);
变量加单引号('),否则会报错:
string jsFunc = "myFunc('" + MyBackValue + "')";
【讨论】:
由于我找不到隐藏代码的解决方案,其中包括尝试像 mutanic 和 Orlando Herrera 在这个问题中所说的 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;"
【讨论】:
您不能直接执行此操作。在标准 WebForms 中,JavaScript 由浏览器解释,C# 由服务器解释。使用 JavaScript 从服务器调用方法的方法是。
WebMethod 作为attribute。 ScriptManager 设置EnablePageMethods 为true。PageMethods调用方法。像这样:
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
}
Page 上添加 ScriptManager
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />
function GetProductsByCategoryID(categoryID)
{
PageMethods.GetProducts(categoryID, OnGetProductsComplete);
}
要从服务器调用 JavaScript 函数,您可以使用 RegisterStartupScript:
ClientScript.RegisterStartupScript(GetType(),"id","callMyJSFunction()",true);
【讨论】:
GetProducts() 函数只是一个代码隐藏函数,它存在于 MVC 应用程序的控制器中,因此标签位于您想要放入的任何函数之上您打算从 JavaScript 调用的控制器。
如果您需要发送一个值作为参数。
string jsFunc = "myFunc(" + MyBackValue + ")";
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "myJsFn", jsFunc, true);
【讨论】:
ScriptManager.RegisterStartupScript(Page, GetType(), "JavaFunction", "AlertError();", true);
使用你的功能就足够了
【讨论】:
我在 Code Behind 中使用了 ScriptManager,它运行良好。
ScriptManager.RegisterStartupScript(UpdatePanel1, UpdatePanel1.GetType(), "CallMyFunction", "confirm()", true);
如果您在 ASP 前端使用 UpdatePanel。 然后,输入 UpdatePanel 名称和使用脚本标签定义的“函数名称”。
【讨论】:
我注意到这里的很多答案都使用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);
当然,我希望不用说您需要将 key 替换为您的密钥标识符,并且可能应该将所有这些移入子/函数/方法并传入 key 和 someJavascriptObject(如果您的 javascript 方法需要您的arg 是一个 javascript 对象)。
MSDN 文档:
https://msdn.microsoft.com/en-us/library/bb338357(v=vs.110).aspx
【讨论】:
工作示例:_
<%@ 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);
}
}
}
可能的陷阱:-
CodeBehind="History.aspx.cs" 指向错误的页面【讨论】:
您可以做的另一件事是创建一个会话变量,该变量在后面的代码中设置,然后检查该变量的状态,然后运行您的 javascript。好消息是这将允许您在您想要的地方运行您的脚本,而不必弄清楚您是否希望它在 DOM 中运行或全局运行。
类似这样的: 后面的代码:
Session["newuser"] = "false"
在 JavaScript 中
var newuser = '<%=Session["newuser"]%>';
if (newuser == "yes")
startTutorial();
【讨论】:
这对我有用
object Json_Object=maintainerService.Convert_To_JSON(Jobitem);
ScriptManager.RegisterClientScriptBlock(this,GetType(), "Javascript", "SelectedJobsMaintainer("+Json_Object+"); ",true);
【讨论】:
ScriptManager.RegisterStartupScript(this, this.Page.GetType(),"updatePanel1Script", "javascript:ConfirmExecute()",true/>
【讨论】:
你可以使用文字:
this.Controls.Add(new LiteralControl("<script type='text/javascript'>myFunction();</script>"));
【讨论】:
IIRC Code behind 是在服务器端编译的,而 javascript 是在客户端解释的。这意味着两者之间没有直接联系。
另一方面,您可以做的是让客户端和服务器通过一个称为 AJAX 的漂亮工具进行通信。 http://en.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML
【讨论】:
从后面的代码调用 JavaScript 函数
第 1 步添加您的 Javascript 代码
<script type="text/javascript" language="javascript">
function Func() {
alert("hello!")
}
</script>
第 2 步在您的 webForm 中添加 1 个 Script Manager 并添加 1 个 按钮
第 3 步在您的按钮点击事件中添加此代码
ScriptManager.RegisterStartupScript(this.Page, Page.GetType(), "text", "Func()", true);
【讨论】:
ScriptManager 时有效,如在此答案中,而不是 Page.ClientScript 如在其他答案中。可能与接受的答案下的asp:UpdatePanel 评论有关。
你可以试试这个:
Page.ClientScript.RegisterStartupScript(this.GetType(),"CallMyFunction","MyFunction()",true);
【讨论】:
Page.ClientScript.RegisterClientScriptBlock 而不是see this post for info。 2. 可能值得一提的是,为了让 MyFunction() 工作,MyFunction() 必须在表单标签之前或内部定义,而不是在 结束标签之后(否则会出现 Object 预期错误发生)
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "text", "openDep()", true); 有效。 this.GetType() 为我抛出错误。
asp:UpdatePanel 包装并写入按钮事件时,这不起作用。这会导致页面回发。
这就是我的做法。
显示标签和按钮控件的 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>";
【讨论】:
C# 到 JavaScript:您可以注册脚本块以在页面上运行,如下所示:
ClientScript.RegisterStartupScript(GetType(),"hwa","alert('Hello World');",true);
将alert() 部分替换为您的函数名称。
要从 JavaScript 调用 C# 方法,您可以使用 ScriptManager 或 jQuery。我个人使用jQuery。您需要使用 WebMethod 属性装饰要从 JavaScript 调用的方法。有关从 jQuery 调用 C# 方法(称为 PageMethod)的更多信息,您可以参考 Dave Ward's 帖子。
【讨论】:
您可以使用 ScriptMethod attribute 在代码隐藏页面上公开 C# 方法以通过 JavaScript 调用。
您不能从 CodeBehind 调用 JavaScript - 该代码仅存在于客户端上。
【讨论】:
你不能。 Codebehind 在服务器上运行,而 JavaScript 在客户端上运行。
但是,您可以将<script type="text/javascript">someFunction();</script> 添加到您的输出中,从而在浏览器解析您的标记时调用 JS 函数。
【讨论】:
您不能从 CodeBehind 调用 Javascript 函数,因为 CodeBehind 文件包含在 Web 服务器上执行服务器端的代码。 Javascript 代码在客户端的网络浏览器中执行。
【讨论】: