使用JavaScript从客户端调用服务器端的非静态方法

19

如何在客户端使用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>

它可以工作。现在我如何从客户端调用非静态方法?

8个回答

18

您可以使用简单的.asmx页面代替codebehind页面,从而避免静态约束。

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

2)SIMPLESERVICE.ASMX-添加一个新的.asmx Web服务(我称之为SimpleService.asmx) 请注意[System.Web.Script.Services.ScriptSerive]装饰和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代码中,我调用类方法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那里找到的示例此处找到。


我已经尝试过了,但它不起作用......是否有任何外部工具需要下载? - Mitesh Jain
我想做类似上面的事情,但我不确定我可以从JavaScript端向我的Web服务函数传递哪些参数。最终,我想传递Page对象,但是当我尝试这样做时,我会遇到各种错误。我能传递.NET对象,比如System.Web.UI.WebControls命名空间中的东西吗? - LeeCambl
2
请注意,您不应再使用 ASMX - 它是一种遗留技术,仅得到了极少的支持。完全可以使用 WCF 来完成完全相同的事情。 - John Saunders

8

你不能从客户端直接调用非静态方法。我曾经尝试过,但是它很丑陋(我使用了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)的方法吗,伙计们.....感谢解决方案...... - Pramulia
@theVillageldiot,你确定仅仅是丑陋吗?还是说我们不应该以这种方式使用它?因为我认为这种调用方式比使用 [web method] 更好。无论如何感谢。 - vesna

2

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

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


好的,我明白了...那么.......................你们有其他解决办法吗,可以在客户端(aspx)调用服务器端(aspx.cs)的方法吗,伙计们......感谢解决方案...... - Pramulia

2

C#

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

JS/jQuery

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

你可以使用protected代替public。 - Mike
我非常确定这不会起作用,因为LoadString不是静态函数。 - eat chocolate
1
是的,它适用于当前的问题。该方法不必是静态的,因为部分类已经初始化。 - Mike
没事了,我没有意识到它是WebService类,我认为这是唯一可以声明WebMethod而不是静态的情况。 - eat chocolate

1
如果您想使用相同的函数进行调用,可以使用以下代码:
[WebMethod]
public static void method1()
{
    ClassOfNonStaticFunction obj = new ClassOfNonStaticFunction();
    obj.yourFunctionName(ParametersIfAny);
}

1
作为对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 触发服务器端的非静态方法。 - Kubi

0

最终我使用了隐藏字段,以防有人阅读此内容。我可以在C#函数中设置值,然后在JavaScript中读取它。


-5

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
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接