【问题标题】:Call non-static method in server-side from client-side using JavsScript使用 JavaScript 从客户端调用服务器端的非静态方法
【发布时间】:2009-09-01 02:24:07
【问题描述】:

如何使用 javascript (aspx) 从客户端调用服务器端 (aspx.cs) 中的非静态方法....?

据我所知,我可以从客户端调用服务器端的静态方法...

服务器端:

 [WebMethod]
 public static void method1()
 {
 }

客户端:

 <script language="JavaScript">
     function keyUP() 
     {
         PageMethods.method1();
     }
 </script>
 <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
 </asp:ScriptManager>

它有效。现在如何从客户端调用非静态方法?

【问题讨论】:

    标签: c# asp.net asmx webmethod


    【解决方案1】:

    您可以通过使用简单的 .asmx 页面而不是代码隐藏页面来避免静态约束。

    1) 使用 AJAX Enable ASP.NET 模板打开新网站(它将必要的引用放在 web.config 中)

    2) SIMPLESERVICE.ASMX - 添加一个新的 .asmx Web 服务(我叫我的 SimpleService.asmx) 请注意 [System.Web.Script.Services.ScriptServe] 装饰以及 SimpleService 类实现了 Webservice。

    <%@ WebService Language="C#" Class="SimpleService" %>
    
    using System;
    using System.Web.Services;
    
    [System.Web.Script.Services.ScriptService]
    public class SimpleService : WebService
    {
        [WebMethod]
        public string GetMessage(string name)
        {
            return "Hello <strong>" + name + "</strong>, the time here is: " + DateTime.Now.ToShortTimeString();
        }
    } 
    

    3) DEFAULT.ASPX - 要使用它,请在脚本管理器中引用该服务,然后您就可以关闭并运行。在我的 Javascript 中,我调用了 class.method - SimpleService.GetMessage。

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>Untitled Page</title>
         <script language="javascript" type="text/javascript">       
            function callServer() {
                SimpleService.GetMessage($get("Name").value, displayMessageCallback);
            }
    
            function displayMessageCallback(result) {
                $get("message").innerHTML = result;
            } 
        </script>
    
    
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:ScriptManager ID="ScriptManager1" runat="server" >
                <Services>
                    <asp:ServiceReference Path="~/SimpleService.asmx" />
                </Services>
            </asp:ScriptManager>
            <div>
            </div>
            <h1>Hello World Example</h1>
    
            <div>
                Enter Name: <input id="Name" type="text" />
    
                <a href="javascript:callServer()">Call Server</a>
    
                <div id="message"></div>
            </div>  
        </form>
    </body>
    </html>
    

    我使用了从 Scott Gu 那里找到的示例 Found Here.

    【讨论】:

    • 我已经尝试过了,但它不起作用.....有没有我必须下载的外部工具?
    • 我想做类似上面的事情,但我不确定我“允许”从 JavaScript 端传递给我的 Web 服务函数的参数类型。最终,我想传递 Page 对象,但是当我尝试这样做时会遇到各种错误。我可以传递 .NET 对象,比如 System.Web.UI.WebControls 命名空间中的东西吗?
    • 请注意,您不应再使用 ASMX - 这是一项遗留技术,几乎不支持。使用 WCF 可以完成完全相同的事情。
    【解决方案2】:

    不,您不能从客户端本身调用非静态方法。我试过一次,但它很丑(我也使用过 jQuery ajax)。只需使用 ajax 调用页面,并在其上附加方法名称作为查询字符串参数,然后在服务器端检查参数并调用相关方法。但正如我告诉过你的那样,它非常丑陋:(

    $.ajax({'/mypage.aspx?m=mymethod',......}); //this is not correct syntax
    

    在服务器端:

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!Request.QueryString.HasKeys() || 
                    string.IsNullOrEmpty(Request.QueryString["m"]))
        {
            //return error or something relevant to your code
        }
        var m = Request.QueryString["m"];
    
        switch(m)
        {
            case "a":
            a();
            break;
            .....
            .....
        }
    }
    

    【讨论】:

    • 好的,我明白了,伙计们......所以............你有另一个解决方案如何调用方法来自客户端(aspx)的服务器端(aspx.cs)......感谢4个解决方案......
    • @theVillageldiot 你确定它只是丑陋吗?或者还有什么我们不应该以这种方式使用它?因为我认为这种调用方式比使用 [web method] 更好。谢谢。
    【解决方案3】:

    C#

    public string LoadString() {
        return "my string";
    }
    

    JS/jQuery

    $('#txt').val(<%= LoadString() %>);
    

    【讨论】:

    • 你可以使用protected而不是public。
    • 我很确定这不会起作用,因为LoadString 不是静态函数。
    • 是的,它适用于手头的问题。该方法不必是静态的,因为部分类已经初始化。
    • 没关系,我没有意识到它是WebService类,我认为这是唯一可以声明WebMethod而不是静态的情况。
    【解决方案4】:

    实际上,你不能以这种方式调用非静态方法。

    当您调用 PageMethod 时,您基本上是在调用一个特殊的 Web 服务。此功能仅适用于同一页面上的静态方法。

    【讨论】:

    • 好的,我明白了,伙计们......所以............你有另一个解决方案如何调用方法来自客户端(aspx)的服务器端(aspx.cs)......感谢4个解决方案......
    【解决方案5】:

    作为对 Pramulia 的回答 我想你想要一个带有客户端参数的函数,该函数在示例中实现 -> CallServer(arg1, arg2)

    <%@ Page Language="C#" AutoEventWireup="true"  %>
    <%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html >
    <head runat="server">
        <title>Client Callbacks</title>
        <script runat="server">
            public void RaiseCallbackEvent(String eventArgument)
            {
                // Processes a callback event on the server using the event
                // argument from the client.
            }
    
            public string GetCallbackResult()
            {
                // Returns the results of a callback event to the client.
                string dateString = DateTime.Now.ToLongDateString();
    
                return dateString;
            }
    
            void Page_Load(object sender, EventArgs e)
            {
                ClientScriptManager cm = Page.ClientScript;
                String cbReference = cm.GetCallbackEventReference(this, "arg",
                    "ReceiveServerData", "");
                String callbackScript = "function CallServer(arg, context) {" +
                    cbReference + "; }";
                cm.RegisterClientScriptBlock(this.GetType(),
                    "CallServer", callbackScript, true);
            }
        </script>
        <script type="text/javascript">
            function ReceiveServerData(arg, context) {
                Message.innerText = "Date from server: " + arg;
            }
        </script>
    </head>
    <body>
        <h2>Client Callbacks Without Postbacks</h2>
        <form id="form1" runat="server">
           <input type="button" value="Callback" 
               onclick="CallServer('1', alert('Callback sent to Server'))" />
           <br />
           <span id="Message"></span>
       </form>
    </body>
    </html>
    

    【讨论】:

    • 我从一些微软网站复制了这个。它工作正常,并从服务器端到客户端获取字符串但是我需要一个从 javascript 触发服务器端非静态方法的解决方案。
    【解决方案6】:

    如果你想使用相同的函数来调用它,你可以使用下面的代码:

    [WebMethod]
    public static void method1()
    {
        ClassOfNonStaticFunction obj = new ClassOfNonStaticFunction();
        obj.yourFunctionName(ParametersIfAny);
    }
    

    【讨论】:

      【解决方案7】:

      我最终使用了隐藏字段,以防有人阅读。我可以在函数下的c#中设置值,然后在javascript中读取它。

      【讨论】:

        【解决方案8】:

        Dave 详细介绍了使用 jquery ajax 从客户端调用页面方法。大致思路是这样的(如果您发现任何问题,请参考 Dave 的网站)。

        C#代码:

        [WebMethod]
        public static string yourmethod(/*params*/)
        {
           return "Hello World!"   
        }
        

        ASPX:

        $.ajax({
            type: 'POST',
            data: /*Your Data*/,
            dataType: 'JSON',
            contentType: 'application/json',
            url: '/yourpage.aspx/yourmethod',//Method to call
            success: function(result, status) {
                //handle return data
            },
            error: function(xhr, status, error) {
                //handle error
            }
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-01
          • 1970-01-01
          • 2018-04-13
          • 1970-01-01
          • 2011-08-30
          • 1970-01-01
          • 2011-03-21
          相关资源
          最近更新 更多