簡體   English   中英

使用JavsScript從客戶端調用服務器端的非靜態方法

[英]Call non-static method in server-side from client-side using JavsScript

如何使用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>

有用。 現在如何從客戶端調用非靜態方法?

您可以使用簡單的.asmx頁面而不是代碼隱藏頁面來避免靜態約束。

1)使用AJAX啟用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中,我調用了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中找到的例子

不,你不能從客戶端本身調用非靜態方法。 我曾嘗試過一次,但它很難看(我也使用過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;
        .....
        .....
    }
}

C#

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

JS / jQuery的

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

實際上,您無法以這種方式調用非靜態方法。

當您調用PageMethod時,您基本上是在調用特殊的Web服務。 此功能僅適用於同一頁面上的靜態方法。

如果要使用相同的函數調用它,可以使用以下代碼:

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

作為對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>

我最終使用隱藏字段,以防有人讀到這個。 我可以在函數下設置c#中的值,然后在javascript中讀取它。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM