2009-09-01 61 views
15

如何在客戶端使用javascript(aspx)....在服務器端(aspx.cs)調用非靜態方法....?使用JavsScript從客戶端調用服務器端的非靜態方法

據我知道我可以調用從客戶端服務器端的靜態方法...

服務器端:

[WebMethod] 
public static void method1() 
{ 
} 

客戶端:

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

它的工作原理。現在我該如何從客戶端調用非靜態方法?

回答

7

不,您不能從客戶端本身調用非靜態方法。我嘗試了一次,但它是醜陋的(我也用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; 
     ..... 
     ..... 
    } 
} 
+0

好的,我知道了它們...... so .......................你有沒有另一個解決方案如何從客戶端(aspx)傢伙在serverside(aspx.cs)中調用方法..... 謝謝4解決方案...... – Pramulia 2009-09-01 04:23:14

+0

@theVillageldiot你確定它只是醜陋嗎?我們以這種方式使用它的任何其他東西?因爲我認爲這種調用方式比使用[web方法]更好。感謝任何方式。 – vesna 2012-11-26 08:34:46

1

其實,你不要叫這種方式非靜態方法

當你調用一個PageMethod的,你基本上調用一個特殊的Web服務,該功能只適用於在同一頁上的靜態方法。

+0

好吧,我得到了它們... 所以.......................你有另一個解決方案如何在服務器端調用方法(aspx.cs )from client side(aspx)guys ..... 謝謝4解決方案...... – Pramulia 2009-09-01 04:22:21

-4

Dave已經寫了約呼叫細節從客戶端使用jQuery Ajax的頁面方法。總的想法是這樣的(如果你發現任何問題,請參考戴夫的網站)。

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

好的......謝謝你...... – Pramulia 2009-09-01 05:28:25

+4

原來的問題沒有問關於非靜態方法? – 2011-03-18 19:37:10

+0

@戈登不知道我爲什麼回答這個問題兩次! – TheVillageIdiot 2011-03-20 07:49:31

0

的回答爲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> 
+0

你試過嗎? – 2010-03-29 02:40:56

+0

我從一些微軟網站複製了這個。它工作正常,並從服務器端獲得一個字符串到客戶端但是我需要一個解決方案,從JavaScript觸發服務器端非靜態方法。 – Kubi 2010-03-29 08:12:51

16

您可以避免靜態約束t通過使用簡單的.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> 

我用我從斯科特谷發現的例子 Found Here.

+0

我試過這個,它不工作.....是否有任何外部工具,我必須讓它下載? – 2013-12-24 11:28:37

+0

我正在尋找像上面這樣的東西,但我不確定哪些參數是「允許」從JavaScript端傳遞給我的Web服務功能的。最終,我想傳遞Page對象,但是當我嘗試這樣做時,我會遇到各種各樣的錯誤。我可以傳遞.NET對象,就像System.Web.UI.WebControls命名空間中的東西一樣嗎? – LeeCambl 2014-07-25 08:46:55

+2

請注意,您不應該再使用ASMX--這是一項傳統技術,只是幾乎不受支持。 WCF可以完成同樣的事情。 – 2014-10-05 18:24:25

1

C#

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

JS/jQuery的

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

您可以使用保護而不是公共。 – Mike 2015-07-29 20:16:33

-1

如果你想使用相同的函數來調用它,您可以使用以下代碼:

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