【问题标题】:How to call code behind server method from a client side JavaScript function?如何从客户端 JavaScript 函数调用服务器方法背后的代码?
【发布时间】:2011-08-15 06:55:03
【问题描述】:

我在 ASPX 页面中有一个用于 HTML 按钮单击事件的 JavaScript 函数。并且在其代码背后的页面中有一个服务器方法。现在我想仅在用户单击 HTML 按钮时才使用一些参数从 JavaScript 函数调用服务器方法。

请不要改变这种情况,也不要在回复时在 aspx 页面中使用任何 asp.net 控件。因为只允许 HTML 控件。谁可以帮我这个事 ?。提前致谢。急切地等待答案。

这是代码,

标记中的代码:

<script language="javascript" type="text/javascript">
    function btnAccept_onclick() {        
        var name;            
        name = document.getElementById('txtName').value;

        // Call Server side method SetName() by passing this parameter 'name'
</script>

<input type="button" id="btnAccept" value="Accept" onclick="return btnAccept_onclick()" />

代码隐藏:

public void SetName(string name)
{
    // Code for some functionality    
}

【问题讨论】:

    标签: c# javascript .net asp.net


    【解决方案1】:

    是的,你可以制作一个像..这样的网络方法

    [WebMethod]
    public static String SetName(string name)
    {
        return "Your String"
    }
    

    然后在 JavaScript 中调用它,例如,

    PageMethods.SetName(parameterValueIfAny, onSuccessMethod,onFailMethod);
    

    这也是必需的:

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

    【讨论】:

    • 启用 PageMethods 时是否存在任何安全问题?我想知道为什么默认禁用它。
    【解决方案2】:

    在我的项目中,我们通常这样调用服务器端方法:

    在 JavaScript 中:

    document.getElementById("UploadButton").click();
    

    服务器端控制:

    <asp:Button runat="server" ID="UploadButton" Text="" style="display:none;" OnClick="UploadButton_Click" />
    

    C#:

    protected void Upload_Click(object sender, EventArgs e)
    {
    
    }
    

    【讨论】:

    • 嗨。如果我的项目有点击方法,这很好用。我在 2 个不同的 asp 按钮中有 2 个 js 函数和 2 个不同的 onclick 方法。一种方法被调用,但另一种方法未被调用。这怎么可能?
    • 调试时出现此错误:JavaScript runtime error: Unable to get property 'click' of undefined or null reference。该按钮位于我的 aspx 文件中,并且在其后面的代码中定义了附加的事件处理程序。有什么想法吗?
    • @sab669,通过使用他的方法,您将面临一个小问题,即ClientID与服务器ID不同。添加额外的属性ClientIDMode = "Static",这样客户端 ID 和服务器 ID 将相同。
    【解决方案3】:

    如果你不想使用ajax而不是

    Code behind 
    
    void myBtn_Click(Object sender,EventArgs e)
    {
       //SetName(name); your code
    }
    
    
    .aspx file
    
    <script language="javascript" type="text/javascript">
        function btnAccept_onclick() {        
            var name;            
            name = document.getElementById('txtName').value;
            document.getElementById('callserver').click();
            // Call Server side method SetName() by passing this parameter 'name'
    </script>
    
    
    <div style="dispaly:none;">
      <input type="button" id="callserver" value="Accept" click="myBtn_Click" runat="server" />
    </div>
    <input type="button" id="btnAccept" value="Accept" onclick="return btnAccept_onclick()" />
    

    或使用页面方法

    .cs file
    [ScriptMethod, WebMethod]
    
       public static string docall()
       {
          return "Hello";
       }
    
    .aspx file
    
    <script type="text/javascript">
          function btnAccept_onclic() {
              PageMethods.docall(onSuccess, onFailure);
          }
    
      function onSuccess(result) {
              alert(result);
          }
    
    
          function onFailure(error) {
              alert(error);
          } 
    
    </script>
    

    检查这个:http://blogs.microsoft.co.il/blogs/gilf/archive/2008/10/04/asp-net-ajax-pagemethods.aspx

    【讨论】:

    • 感谢您的快速响应,但不要在 aspx 页面中使用任何带有 runat="server" 标记的控件(asp.net 或 HTML)。并尽可能避免使用 ajax。
    • 第二种方法没有任何服务器标签,但您需要使用使用 ajax 的页面方法
    【解决方案4】:

    JS代码:

    <script type="text/javascript">
             function ShowCurrentTime(name) {
             PageMethods.GetCurrentTime(name, OnSuccess);
             }
             function OnSuccess(response, userContext, methodName) {
              alert(response);
             }
    </script>
    

    HTML 代码:

    <asp:ImageButton ID="IMGBTN001" runat="server" ImageUrl="Images/ico/labaniat.png"
    class="img-responsive em-img-lazy" OnClientClick="ShowCurrentTime('01')" />
    

    C# 背后的代码

    [System.Web.Services.WebMethod]
    public static string GetCurrentTime(string name)
    {
        return "Hello " + name + Environment.NewLine + "The Current Time is: "
                + DateTime.Now.ToString();
    }
    

    【讨论】:

      【解决方案5】:

      我必须将我的 buttonid 注册为回发触发器...

      RegisterPostbackTrigger(idOfButton)
      

      【讨论】:

        【解决方案6】:

        Ajax 是要走的路。最简单(也可能是最好)的方法是jQuery ajax()

        你最终会写出这样的东西:

        $.ajax({
          url: "test.html",
          context: document.body,
          success: function(){
            // do something when done
          }
        });
        

        【讨论】:

          【解决方案7】:

          尝试创建一个新服务并调用它。处理可以在那里完成,然后返回。

          http://code.msdn.microsoft.com/windowsazure/WCF-Azure-AJAX-Calculator-4cf3099e

          function makeCall(operation){
              var n1 = document.getElementById("num1").value;
              var n2 = document.getElementById("num2").value;
          if(n1 && n2){
          
                  // Instantiate a service proxy
                  var proxy = new Service();
          
                  // Call correct operation on vf cproxy       
                  switch(operation){
          
                      case "gridOne":
                          proxy.Calculate(AjaxService.Operation.getWeather, n1, n2,
           onSuccess, onFail, null);
          
          ****HTML CODE****
          <p>Major City: <input type="text" id="num1" onclick="return num1_onclick()"
          /></p>
          <p>Country: <input type="text" id="num2" onclick="return num2_onclick()"
          /></p> 
          <input id="btnDivide" type="button" onclick="return makeCall('gridOne');" 
          

          【讨论】:

            【解决方案8】:

            在我看来,user1965719 提出的解决方案确实很优雅。在我的项目中,进入包含 div 的所有对象都是动态创建的,因此添加额外的隐藏按钮是轻而易举的事:

            aspx 代码:

                <asp:Button runat="server" id="btnResponse1" Text="" 
                style="display: none; width:100%; height:100%"
                OnClick="btnResponses_Clicked" />
            
                <div class="circlebuttontext" id="calendarButtonText">Calendar</div>
            </div>    
            

            后面的C#代码:

            protected void btnResponses_Clicked(object sender, EventArgs e)
            {
                if(sender == btnResponse1)
                {
                    //Your code behind logic for that button goes here
                }
            }
            

            【讨论】:

              【解决方案9】:
              // include jquery.js
              //javascript function
              var a1="aaa";
              var b1="bbb";
                                       **pagename/methodname**     *parameters*
              CallServerFunction("Default.aspx/FunPubGetTasks", "{a:'" + a1+ "',b:'" + b1+ "'}",
                          function(result)
                          {
              
                          }
              );
              function CallServerFunction(StrPriUrl,ObjPriData,CallBackFunction)
               {
              
                  $.ajax({
                      type: "post",
                      url: StrPriUrl,
                      contentType: "application/json; charset=utf-8",
                      data: ObjPriData,
                      dataType: "json",
                      success: function(result) 
                      {
                          if(CallBackFunction!=null && typeof CallBackFunction !='undefined')
                          {
                              CallBackFunction(result);
                          }
              
                      },
                      error: function(result) 
                      {
                          alert('error occured');
                          alert(result.responseText);
                          window.location.href="FrmError.aspx?Exception="+result.responseText;
                      },
                      async: true
                  });
               }
              
              //page name is Default.aspx & FunPubGetTasks method
              ///your code behind function
                   [System.Web.Services.WebMethod()]
                      public static object FunPubGetTasks(string a, string b)
                      {
                          //return Ienumerable or array   
                      }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2011-08-30
                • 2013-09-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多