【问题标题】:Calling JavaScript Function From CodeBehind从 CodeBehind 调用 JavaScript 函数
【发布时间】:2011-08-09 12:40:50
【问题描述】:

谁能提供从 CodeBehind 调用 JavaScript 函数的好例子,反之亦然?

【问题讨论】:

    标签: c# javascript asp.net


    【解决方案1】:

    在后面的代码中试试这个,它会 100% 工作

    在你的代码隐藏文件中写这行代码

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

    这是网页表单页面

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

    【讨论】:

      【解决方案2】:

      感谢“Liko”,只需在他的回答中添加评论即可。

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

      变量加单引号('),否则会报错:

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

      【讨论】:

        【解决方案3】:

        由于我找不到隐藏代码的解决方案,其中包括尝试像 mutanic 和 Orlando Herrera 在这个问题中所说的 ClientScriptScriptManager(他们都以某种方式失败了),所以我将提供一个前台 -如果其他人与我处于同一位置,则使用按钮单击其他人的最终解决方案。这对我有用:

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

        【讨论】:

          【解决方案4】:

          您不能直接执行此操作。在标准 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 步:在 Page 上添加 ScriptManager

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

          第 3 步:使用 JavaScript 调用方法

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

          Take a look at this link.

          要从服务器调用 JavaScript 函数,您可以使用 RegisterStartupScript:

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

          【讨论】:

          • 您将第一步放在 MVC 3 文件层次结构中的什么位置?
          • @Rob GetProducts() 函数只是一个代码隐藏函数,它存在于 MVC 应用程序的控制器中,因此标签位于您想要放入的任何函数之上您打算从 JavaScript 调用的控制器。
          【解决方案5】:

          如果您需要发送一个值作为参数。

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

          【讨论】:

            【解决方案6】:
            ScriptManager.RegisterStartupScript(Page, GetType(), "JavaFunction", "AlertError();", true);
            

            使用你的功能就足够了

            【讨论】:

            • 你能解释一下你的答案吗?
            • 这个“JavaFunction”参数是什么?我们可以在其中添加任何东西吗?这个论点需要什么?
            • @SenuraDissanayake 这是一个标题——是的,它可以是任何东西,但并不重要。
            【解决方案7】:

            我在 Code Behind 中使用了 ScriptManager,它运行良好。

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

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

            【讨论】:

              【解决方案8】:

              我注意到这里的很多答案都使用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

              【讨论】:

                【解决方案9】:

                工作示例:_

                <%@ 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 函数出错

                【讨论】:

                • 感谢您发布我能理解如何实现的唯一工作示例
                【解决方案10】:

                您可以做的另一件事是创建一个会话变量,该变量在后面的代码中设置,然后检查该变量的状态,然后运行您的 javascript。好消息是这将允许您在您想要的地方运行您的脚本,而不必弄清楚您是否希望它在 DOM 中运行或全局运行。

                类似这样的: 后面的代码:

                Session["newuser"] = "false" 
                

                在 JavaScript 中

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

                【讨论】:

                  【解决方案11】:

                  这对我有用

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

                  【讨论】:

                    【解决方案12】:
                    ScriptManager.RegisterStartupScript(this, this.Page.GetType(),"updatePanel1Script", "javascript:ConfirmExecute()",true/>
                    

                    【讨论】:

                    • 添加一些解释
                    【解决方案13】:

                    你可以使用文字:

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

                    【讨论】:

                    • 但这不只是将脚本添加到内存中,它实际上并没有运行它吗?
                    【解决方案14】:

                    IIRC Code behind 是在服务器端编译的,而 javascript 是在客户端解释的。这意味着两者之间没有直接联系。

                    另一方面,您可以做的是让客户端和服务器通过一个称为 AJAX 的漂亮工具进行通信。 http://en.wikipedia.org/wiki/Asynchronous_JavaScript_and_XML

                    【讨论】:

                      【解决方案15】:

                      从后面的代码调用 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);
                      

                      【讨论】:

                      • 当单击 GridView 行时尝试执行此操作时,它仅在使用 ScriptManager 时有效,如在此答案中,而不是 Page.ClientScript 如在其他答案中。可能与接受的答案下的asp:UpdatePanel 评论有关。
                      【解决方案16】:

                      你可以试试这个:

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

                      【讨论】:

                      • 我会选择 ScriptManager.RegisterStartupScript(Page, typeof(Page), "somekey", script, true);方法。它也适用于部分回发。
                      • 1.有时需要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 包装并写入按钮事件时,这不起作用。这会导致页面回发。
                      【解决方案17】:

                      这就是我的做法。

                      显示标签和按钮控件的 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>";
                      

                      【讨论】:

                        【解决方案18】:

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

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

                        alert() 部分替换为您的函数名称。

                        要从 JavaScript 调用 C# 方法,您可以使用 ScriptManagerjQuery。我个人使用jQuery。您需要使用 WebMethod 属性装饰要从 JavaScript 调用的方法。有关从 jQuery 调用 C# 方法(称为 PageMethod)的更多信息,您可以参考 Dave Ward's 帖子。

                        【讨论】:

                          【解决方案19】:

                          您可以使用 ScriptMethod attribute 在代码隐藏页面上公开 C# 方法以通过 JavaScript 调用。

                          您不能从 CodeBehind 调用 JavaScript - 该代码仅存在于客户端上。

                          【讨论】:

                            【解决方案20】:

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

                            但是,您可以将&lt;script type="text/javascript"&gt;someFunction();&lt;/script&gt; 添加到您的输出中,从而在浏览器解析您的标记时调用 JS 函数。

                            【讨论】:

                            • “你不能。但是你可以这样做。”
                            • 我不会考虑从服务器端代码调用方法,因为您没有真正的方法来获取返回值或指定回调。
                            • 哦,当然可以。您可以从您的 javascript 或 AJAX 中调用任何回传。我觉得好笑;我倾向于做同样的事情——“不,那是不可能的。如果可以的话,没有人愿意这样做。”然后几分钟后“所以这就是我们要做的事情。”
                            【解决方案21】:

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

                            【讨论】:

                            • 你不能像在 myCoolJavascriptFunction(javascriptFunctionArgs); 中那样直接调用 javascript 函数;在服务器上,但您可以从 WebForms 页面中的代码调用 javascript 函数。
                            • 同意cloudstrifebro
                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2015-07-23
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-09-12
                            • 2012-05-02
                            相关资源
                            最近更新 更多