从CodeBehind调用JavaScript函数


Answers:


206

您可以尝试以下方法:

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

41
我会去ScriptManager.RegisterStartupScript(Page,typeof(Page),“ somekey”,script,true); 方法。它也可以在部分回发期间使用。
rdmptn

10
1.有时Page.ClientScript.RegisterClientScriptBlock是必需的, 请参阅此帖子以获取信息。2.可能值得一提的是,为了使MyFunction()正常工作,必须在Form标记之前或之中,而不是在</ form>结束标记之后定义MyFunction()(否则,对象预期错误将发生)
BornToCode 2013年

2
ScriptManager.RegisterStartupScript(this.Page, typeof(Page), "text", "openDep()", true);作品。this.GetType()为我抛出一个错误。
SearchForKnowledge

2
当代码用an包装asp:UpdatePanel并在按钮事件中编写时,此方法不起作用。这导致页面回发。
Senura Dissanayake

52

C#到JavaScript:您可以注册脚本块以在页面上运行,如下所示:

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

alert()用您的函数名称替换部件。

要从JavaScript调用C#方法,可以使用ScriptManagerjQuery。我个人使用jQuery。您需要使用WebMethod属性修饰要从JavaScript调用的方法。有关PageMethod从中调用C#方法(称为)的更多信息,jQuery请参阅Dave Ward的文章。


51

从代码后面调用JavaScript函数

步骤1添加您的Javascript代码

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

步骤2加1 脚本管理的WebForm中,添加1个按钮太多

步骤3在您的按钮点击事件中添加此代码

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

当尝试单击GridView行时执行此操作时,它仅ScriptManager在按此答案使用时有效,而Page.ClientScript与其他答案一样使用。可能与asp:UpdatePanel接受答案下的评论有关。
克里斯,

16

您不能直接这样做。在标准WebForms中,JavaScript由浏览器解释,而C#由服务器解释。您可以使用JavaScript从服务器调用方法。

像这样:

第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

你不能。JavaScript在客户端上运行时,Codebehind在服务器上运行。

但是,您可以添加<script type="text/javascript">someFunction();</script>到输出中,从而导致浏览器解析标记时调用JS函数。


65
“你不能。但是这是你怎么做的。”

3
我不会考虑从服务器端代码调用方法,因为您没有获取返回值或指定回调的真正方法。
ThiefMaster

8
噢,当然可以。您可以通过javascript或AJAX回调任何回调。我觉得好笑; 我倾向于做同样的事情-“不,那是不可能的。如果可以的话,没人愿意这样做。” 然后几分钟后,“这就是我们要做的事情。”



5

在“隐藏代码”中尝试此方法,它将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/>

8
添加一些说明
ketan '16

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/zh-CN/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

因为我无法找到一个解决方案,为后面的代码,其中包括尝试ClientScriptScriptManager喜欢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

我在Code Behind中使用了ScriptManager,并且效果很好。

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

如果您在ASP前端中使用UpdatePanel。然后,输入使用脚本标签定义的UpdatePanel名称和“函数名称”。


0

感谢“ Liko”,只需在评论中添加评论。

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

'在变量中添加了单引号(),否则将显示错误消息:

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

-1

您无法从CodeBehind调用Javascript函数,因为CodeBehind文件包含在Web服务器上执行服务器端的代码。Javascript代码在客户端的Web浏览器中执行。


1
您不能像myCoolJavascriptFunction(javascriptFunctionArgs)一样直接调用javascript函数;在服务器上,但是您可以从WebForms页面中后面的代码中调用javascript函数。
cr1pto

同意cloudstrifebro
Khurram Ishaque '19

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.