【问题标题】:Call ASP.NET function from JavaScript?从 JavaScript 调用 ASP.NET 函数?
【发布时间】:2010-09-05 10:42:24
【问题描述】:

我正在用 ASP.NET 编写网页。我有一些 JavaScript 代码,还有一个带有点击事件的提交按钮。

是否可以用 JavaScript 的点击事件调用我在 ASP 中创建的方法?

【问题讨论】:

  • 您应该使用一些 Ajax 库,例如:Anthem

标签: javascript c# asp.net onclick


【解决方案1】:

您可以使用 .NET Ajax PageMethods 异步执行此操作。请参阅herehere

【讨论】:

    【解决方案2】:

    我认为博文 How to fetch & show SQL Server database data in ASP.NET page using Ajax (jQuery) 会对你有所帮助。

    JavaScript 代码

    <script src="http://code.jquery.com/jquery-3.3.1.js" />
    <script language="javascript" type="text/javascript">
    
        function GetCompanies() {
            $("#UpdatePanel").html("<div style='text-align:center; background-color:yellow; border:1px solid red; padding:3px; width:200px'>Please Wait...</div>");
            $.ajax({
                type: "POST",
                url: "Default.aspx/GetCompanies",
                data: "{}",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                success: OnSuccess,
                error: OnError
            });
        }
    
        function OnSuccess(data) {
            var TableContent = "<table border='0'>" +
                                    "<tr>" +
                                        "<td>Rank</td>" +
                                        "<td>Company Name</td>" +
                                        "<td>Revenue</td>" +
                                        "<td>Industry</td>" +
                                    "</tr>";
            for (var i = 0; i < data.d.length; i++) {
                TableContent += "<tr>" +
                                        "<td>"+ data.d[i].Rank +"</td>" +
                                        "<td>"+data.d[i].CompanyName+"</td>" +
                                        "<td>"+data.d[i].Revenue+"</td>" +
                                        "<td>"+data.d[i].Industry+"</td>" +
                                    "</tr>";
            }
            TableContent += "</table>";
    
            $("#UpdatePanel").html(TableContent);
        }
    
        function OnError(data) {
    
        }
    </script>
    

    ASP.NET 服务器端函数

    [WebMethod]
    [ScriptMethod(ResponseFormat= ResponseFormat.Json)]
    public static List<TopCompany> GetCompanies()
    {
        System.Threading.Thread.Sleep(5000);
        List<TopCompany> allCompany = new List<TopCompany>();
        using (MyDatabaseEntities dc = new MyDatabaseEntities())
        {
            allCompany = dc.TopCompanies.ToList();
        }
        return allCompany;
    }
    

    【讨论】:

      【解决方案3】:

      我正在尝试实现这一点,但它无法正常工作。该页面是 发回,但我的代码没有被执行。当我调试 页面, RaisePostBackEvent 永远不会被触发。我做过的一件事 不同的是我在用户控件而不是 aspx 中执行此操作 页面。

      如果其他人也像 Merk 一样,遇到困难,我有一个解决方案:

      当您拥有用户控件时,您似乎还必须在父页面中创建 PostBackEventHandler。然后您可以通过直接调用它来调用用户控件的 PostBackEventHandler。见下文:

      public void RaisePostBackEvent(string _arg)
      {
          UserControlID.RaisePostBackEvent(_arg);
      }
      

      其中 UserControlID 是您在将父页面嵌套在标记中时赋予用户控件的 ID。

      注意:您也可以直接调用属于该用户控件的方法(在这种情况下,您只需要父页面中的 RaisePostBackEvent 处理程序):

      public void RaisePostBackEvent(string _arg)
      {
          UserControlID.method1();
          UserControlID.method2();
      }
      

      【讨论】:

      • 请打开一个新问题。您发布的问题已超过 5 年。
      • 对不起。当我有机会时,我会这样做。
      【解决方案4】:

      静态的强类型编程对我来说一直很自然,所以起初我拒绝学习 JavaScript(更不用说 HTML 和 CSS),因为我不得不为我的应用程序构建基于 Web 的前端。只要我可以编写纯 C# 代码,我会做任何事情来解决这个问题,比如重定向到一个页面来执行和操作 OnLoad 事件。

      但是,您会发现,如果您要与网站打交道,则必须保持开放的心态并开始考虑更多面向 Web 的思维(也就是说,不要尝试在服务器上做客户端的事情,反之亦然-反之亦然)。我喜欢 ASP.NET 网络表单并且仍然使用它(以及MVC),但我会说,通过尝试使事情变得更简单并隐藏客户端和服务器的分离,它可能会使新手感到困惑,实际上最终会让事情变得更加困难有时。

      我的建议是学习一些基本的 JavaScript(如何注册事件、检索 DOM 对象、操作 CSS 等),你会发现 Web 编程更有趣(更不用说更容易了)。很多人提到了不同的 Ajax 库,但我没有看到任何实际的 Ajax 示例,所以就在这里。 (如果您不熟悉 Ajax,它就是发出异步 HTTP 请求以刷新内容(或者在您的场景中执行服务器端操作),而无需重新加载整个页面或执行完整的回发。

      客户端:

      <script type="text/javascript">
      var xmlhttp = new XMLHttpRequest(); // Create object that will make the request
      xmlhttp.open("GET", "http://example.org/api/service", "true"); // configure object (method, URL, async)
      xmlhttp.send(); // Send request
      
      xmlhttp.onstatereadychange = function() { // Register a function to run when the state changes, if the request has finished and the stats code is 200 (OK). Write result to <p>
          if (xmlhttp.readyState == 4 && xmlhttp.statsCode == 200) {
                document.getElementById("resultText").innerHTML = xmlhttp.responseText;
          }
      };
      </script>
      

      就是这样。尽管名称可能会产生误导,但结果也可以是纯文本或 JSON,但您不仅限于 XML。 jQuery 提供了一个更简单的接口来进行 Ajax 调用(以及简化其他 JavaScript 任务)。

      请求可以是 HTTP-POST 或 HTTP-GET,并且不必发送到网页,但您可以发送到任何侦听 HTTP 请求的服务,例如 RESTful API。 ASP.NET MVC 4 Web API 也使设置服务器端 Web 服务来处理请求变得轻而易举。但是很多人不知道,你也可以将 API 控制器添加到 Web 表单项目中,并使用它们来处理这样的 Ajax 调用。

      服务器端:

      public class DataController : ApiController
      {
          public HttpResponseMessage<string[]> Get()
          {
              HttpResponseMessage<string[]> response = new HttpResponseMessage<string[]>(
                  Repository.Get(true),
                  new MediaTypeHeaderValue("application/json")
              );
      
              return response;
          }
      }
      

      Global.asax

      然后只需在 Global.asax 文件中注册 HTTP 路由,这样 ASP.NET 就会知道如何引导请求。

      void Application_Start(object sender, EventArgs e)
      {
          RouteTable.Routes.MapHttpRoute("Service", "api/{controller}/{id}");
      }
      

      使用 AJAX 和控制器,您可以随时异步回传到服务器以执行任何服务器端操作。这种一举两得的方式既提供了 JavaScript 的灵活性,又提供了 C#/ASP.NET 的强大功能,为访问您网站的人提供了更好的整体体验。在不牺牲任何东西的情况下,您可以两全其美。

      参考文献

      【讨论】:

        【解决方案5】:

        感谢跨浏览器,这个回复对我来说就像轻而易举:

        __doPostBack() 方法效果很好。

        另一种解决方案(非常老套)是在您的标记中简单地添加一个不可见的 ASP 按钮,然后使用 JavaScript 方法单击它。

        <div style="display: none;"> 
            <asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" /> 
        </div> 
        

        从您的 JavaScript 中,使用其 ClientID 检索对按钮的引用,然后对其调用 .Click() 方法:

        var button = document.getElementByID(/* button client id */); 
        
        button.Click(); 
        

        块引用

        【讨论】:

          【解决方案6】:

          我尝试了这个,所以我可以在使用 jQuery 时运行 Asp.Net 方法。

          1. 在您的 jQuery 代码中进行页面重定向

            window.location = "Page.aspx?key=1";
            
          2. 然后在页面加载中使用查询字符串

            protected void Page_Load(object sender, EventArgs e)
            {
                if (Request.QueryString["key"] != null)
                {
                    string key= Request.QueryString["key"];
                    if (key=="1")
                    {
                        // Some code
                    }
                }
            }
            

          所以不需要运行额外的代码

          【讨论】:

            【解决方案7】:

            实现这一点的最简单和最好的方法是使用onmouseup() JavaScript 事件而不是onclick()

            这样您将在单击后触发 JavaScript,并且不会干扰 ASP OnClick() 事件。

            【讨论】:

              【解决方案8】:

              请试试这个:

              <%= Page.ClientScript.GetPostBackEventReference(ddlVoucherType, String.Empty) %>;
              

              ddlVoucherType 是一个被选中的索引变化会调用的控件……你可以在这个控件的选中的索引变化上放任何函数。

              【讨论】:

                【解决方案9】:

                关于:

                var button = document.getElementById(/* Button client id */);
                
                button.click();
                

                应该是这样的:

                var button = document.getElementById('<%=formID.ClientID%>');
                

                formID 是 .aspx 文件中的 ASP.NET 控件 ID。

                【讨论】:

                  【解决方案10】:

                  您也可以通过在 JavaScript 代码中添加这一行来获取它:

                  document.getElementById('<%=btnName.ClientID%>').click()
                  

                  我觉得这个很简单!

                  【讨论】:

                    【解决方案11】:

                    试试这个:

                    if(!ClientScript.IsStartupScriptRegistered("window"))
                    {
                        Page.ClientScript.RegisterStartupScript(this.GetType(), "window", "pop();", true);
                    }
                    

                    或者这个

                    Response.Write("<script>alert('Hello World');</script>");
                    

                    使用按钮的 OnClientClick 属性调用 JavaScript 函数...

                    【讨论】:

                      【解决方案12】:

                      如果你想触发一个服务器端的事件处理程序,例如Button的点击事件,这两种场景(即同步/异步)都非常容易。

                      用于触发控件的事件处理程序: 如果您已经在页面上添加了 ScriptManager,请跳过第 1 步。

                      1. 在您的页面客户端脚本部分添加以下内容

                        //<![CDATA[
                        var theForm = document.forms['form1'];
                        if (!theForm) {
                            theForm = document.form1;
                        }
                        function __doPostBack(eventTarget, eventArgument) {
                            if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
                                theForm.__EVENTTARGET.value = eventTarget;
                                theForm.__EVENTARGUMENT.value = eventArgument;
                                theForm.submit();
                            }
                        }
                        //]]>
                        
                        1. 为您的控件编写服务器端事件处理程序

                          protected void btnSayHello_Click(object sender, EventArgs e) { Label1.Text = "你好世界..."; }

                        2. 添加客户端函数以调用服务器端事件处理程序

                          函数 SayHello() { __doPostBack("btnSayHello", ""); }

                      将上面代码中的“btnSayHello”替换为您的控件的客户端 ID。

                      这样做,如果您的控件位于更新面板内,页面将不会刷新。就是这么简单。

                      要说的另一件事是:小心使用客户端 ID,因为它取决于您使用 ClientIDMode 属性定义的 ID 生成策略。

                      【讨论】:

                        【解决方案13】:

                        您可以使用 PageMethods.Your C# method Name 将 C# 方法或 VB.NET 方法访问到 JavaScript。

                        【讨论】:

                          【解决方案14】:

                          Microsoft AJAX 库将完成此操作。您还可以创建自己的解决方案,包括使用 AJAX 调用您自己的 aspx(基本上)脚本文件来运行 .NET 函数。

                          这是一个名为 AjaxPro 的库,它编写了一个名为 Michael Schwarz 的 MVP。这是不是由 Microsoft 编写的库。

                          我广泛使用了 AjaxPro,它是一个非常好的库,我推荐它用于简单的服务器回调。它在 Microsoft 版本的 Ajax 中运行良好,没有任何问题。但是,我要指出,由于 Microsoft 使 Ajax 变得如此简单,我只会在真正需要时才使用它。需要大量 JavaScript 才能完成一些从 Microsoft 获得的非常复杂的功能,只需将其放入更新面板即可。

                          【讨论】:

                          • 我希望这篇文章更接近上面的那个......我花了几分钟试图弄清楚为什么 MS 文档中没有提到该方法:/
                          • @Dave 这就是为什么人们应该对答案发表评论,而不是将 cmets 作为唯一答案添加到其他答案中。
                          【解决方案15】:

                          __doPostBack() 方法效果很好。

                          另一种解决方案(非常老套)是在您的标记中简单地添加一个不可见的 ASP 按钮,然后使用 JavaScript 方法单击它。

                          <div style="display: none;">
                             <asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" />
                          </div>
                          

                          从您的 JavaScript 中,使用按钮的 ClientID 检索对按钮的引用,然后对其调用 .click() 方法。

                          var button = document.getElementById(/* button client id */);
                          
                          button.click();
                          

                          【讨论】:

                          【解决方案16】:

                          好吧,如果您不想使用 Ajax 或任何其他方式执行此操作,而只想进行正常的 ASP.NET 回发,那么您可以这样做(不使用任何其他库):

                          虽然有点棘手... :)

                          我。在您的代码文件中(假设您使用 C# 和 .NET 2.0 或更高版本)将以下接口添加到您的 Page 类以使其看起来像

                          public partial class Default : System.Web.UI.Page, IPostBackEventHandler{}
                          

                          二。这应该(使用 Tab-Tab)将此函数添加到您的代码文件中:

                          public void RaisePostBackEvent(string eventArgument) { }
                          

                          三。在 JavaScript 中的 onclick 事件中,编写以下代码:

                          var pageId = '<%=  Page.ClientID %>';
                          __doPostBack(pageId, argumentString);
                          

                          这将调用代码文件中的“RaisePostBackEvent”方法,并将“eventArgument”作为您从 JavaScript 传递的“argumentString”。现在,您可以调用任何其他您喜欢的事件。

                          P.S:那是“下划线-下划线-doPostBack”……而且,该序列中不应该有空格……不知何故,WMD 不允许我写下划线后跟一个字符!

                          【讨论】:

                          • 我正在尝试实现这一点,但它无法正常工作。该页面正在回发,但我的代码没有被执行。当我调试页面时, RaisePostBackEvent 永远不会被触发。我做的不同的一件事是我在用户控件而不是 aspx 页面中执行此操作。
                          • 它给了我一个错误,说对象是预期的。我是这样称呼它的:window.onbeforeunload = confirmExit; //debugger; function confirmExit() { var pageId = '&lt;%= Page.ClientID %&gt;'; var argumentString = 'ReleaseLock'; __doPostBack(pageId, argumentString); }
                          • 无论出于何种原因,我无法让它与onkeyup 事件一起使用。得到JavaScript runtime error: '__doPostBack' is undefined。我正在使用 C# 和 ASP.NET 2.0。
                          【解决方案17】:

                          如果您收到对象预期错误,请将此行添加到页面加载。

                          ClientScript.GetPostBackEventReference(this, "");
                          

                          【讨论】:

                            【解决方案18】:

                            Microsoft AJAX library 将完成此操作。您还可以创建自己的解决方案,包括使用 AJAX 调用您自己的 aspx(基本上)脚本文件来运行 .NET 函数。

                            我建议使用 Microsoft AJAX 库。安装并引用后,您只需在页面加载或初始化中添加一行:

                            Ajax.Utility.RegisterTypeForAjax(GetType(YOURPAGECLASSNAME))
                            

                            然后您可以执行以下操作:

                            <Ajax.AjaxMethod()> _
                            Public Function Get5() AS Integer
                                Return 5
                            End Function
                            

                            然后,你可以在你的页面上调用它:

                            PageClassName.Get5(javascriptCallbackFunction);
                            

                            你的函数调用的最后一个参数必须是AJAX请求返回时将执行的javascript回调函数。

                            【讨论】:

                              【解决方案19】:

                              如果页面上没有生成__doPostBack函数,需要插入一个控件来强制,如下:

                              <asp:Button ID="btnJavascript" runat="server" UseSubmitBehavior="false" />
                              

                              【讨论】:

                                【解决方案20】:

                                您可能希望为常用方法创建 Web 服务。
                                只需在要调用的函数上添加一个 WebMethodAttribute 即可。
                                拥有包含所有常用内容的 Web 服务也使系统更易于维护。

                                【讨论】:

                                  猜你喜欢
                                  • 2011-04-30
                                  • 1970-01-01
                                  • 2013-10-24
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 1970-01-01
                                  • 2015-12-06
                                  • 1970-01-01
                                  相关资源
                                  最近更新 更多