【问题标题】:Call Code Behind Function from JavaScript (not AJAX!)从 JavaScript 调用函数背后的代码(不是 AJAX!)
【发布时间】:2014-05-16 22:48:38
【问题描述】:

我的服务器端有一个函数。

protected void SelectParticipant(string CompanyId, string EmployeeNumber)
{
    //I do some stuff here.
}

我想在客户端从 JavaScript 调用这个函数。我试过搜索它,但我发现的所有建议都是通过 AJAX 调用页面方法。我不想这样,我想引起回发。

function MyJSFunction(companyid, employeenumber)
{
    //cause postback and pass the companyid and employee number
    //this is where I need help!
}

如何通过我的 JavaScript 进行回发并运行服务器端函数?

【问题讨论】:

    标签: c# javascript asp.net webforms


    【解决方案1】:

    您可以使用两个HiddenField 来解决您的问题。

    • 使用 js/jquery 设置两个 HiddenField(随你喜欢)
    • 在js函数中强制表单提交(form1.submit())
    • 在 formLoad 中检查 HiddenFields 是否为空。如果没有运行您的方法,然后清除 HiddenFields

    【讨论】:

    • +1 谢谢,我使用的解决方案在概念上与此类似。
    【解决方案2】:

    我是这样做的……

    <script type="text/javascript">
    function AddParticipant(companyid, employeenumber)
        {
            $("#AddParticipantPanel").dialog("close");
            var myargs = {CompanyId: companyid, EmployeeNumber: employeenumber};
            var myargs_json = JSON.stringify(myargs);
            __doPostBack('<%= SelectParticipantBtn.UniqueID %>', myargs_json);
        }
    </script>
    <asp:Button runat="server" ID="SelectParticipantBtn" ClientIDMode="Static" OnClick="SelectParticipantBtn_Click" style="display:none;" />
    

    在服务器端...

    /* this is an inner class */
    public class SelectParticipantEventArgs
    {
        public string CompanyId {get; set;}
        public string EmployeeNumber {get; set;}
    }
    protected void SelectParticipantBtn_Click(object sender, EventArgs e)
    {   
        string args = Request.Form["__EVENTARGUMENT"];
        var myargs = JsonConvert.DeserializeObject<SelectParticipantEventArgs>(args);
        string emp_no = myargs.EmployeeNumber;
        string company_id = myargs.CompanyId;
        //do stuff with my arguments
    }
    

    我没有使用 HiddenFields,而是使用了隐藏按钮。这个模型效果更好,因为我可以直接进入按钮的事件处理程序,而不必向 Page_Load 函数添加代码。

    【讨论】:

      【解决方案3】:

      您可以使用 __doPostBack 函数发布到服务器。只需确保将服务器控件添加到页面,以便插入该功能。这是一个小示例,您可以根据需要进行自定义:

      aspx:

      <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="Try1.WebForm1" EnableEventValidation="false"%>
      
      <!DOCTYPE html>
      
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head runat="server">
          <title></title>
          <script src="Scripts/jquery-1.10.2.min.js"></script>
          <script type="text/javascript">
              $(document).ready(function () {
                  $('#lblInvoke').hover(
                      function () {
                          __doPostBack('<%= LinkButton1.ClientID %>', 'value1,value2');
                           }
                      );
                   });
          </script>
      </head>
      <body>
          <form id="form1" runat="server">
          <div>
              <label id="lblInvoke">Hover This!</label>
              <br />
              <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click" Style="display:none;">LinkButton</asp:LinkButton>
              <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
          </div>
      
          </form>
      </body>
      </html>
      

      后面的代码:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Web;
      using System.Web.UI;
      using System.Web.UI.WebControls;
      
      namespace Try1
      {
          public partial class WebForm1 : System.Web.UI.Page
          {
              protected void Page_Load(object sender, EventArgs e)
              {
      
              }
              protected void LinkButton1_Click(object sender, EventArgs e)
              {
                  string passedArgument = Request.Params.Get("__EVENTARGUMENT");
                  string[] paramsArray = passedArgument.Split(',');
                  Label1.Text = string.Format("Returned from server. params: {0},{1}", paramsArray[0], paramsArray[1]);
              }
          }
      }
      

      确保将 EnableEventValidation="false" 属性添加到页面。

      【讨论】:

      • +1 在您发布之前几分钟,我设法弄清楚了这一点。我确实有一个改进:我将参数作为 JSON 对象传递以避免需要解析字符串。
      • 我看到你在我发布自己的那一刻...JSON 的东西肯定更优雅。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 2013-09-01
      • 2012-01-23
      • 1970-01-01
      相关资源
      最近更新 更多