2009-09-01 14 views
15

Come si chiama un metodo non statico sul lato server (aspx.cs) dal lato client utilizzando javascript (aspx) ....?Chiamare il metodo non statico nel lato server dal lato client utilizzando JavsScript

Per quanto ne so di poter chiamare il metodo statico nel lato server dal lato client ... lato

server:

[WebMethod] 
public static void method1() 
{ 
} 

lato client:

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

Funziona. Come si chiama il metodo non statico dal lato client?

risposta

7

No, non è possibile chiamare i metodi non statici dal lato client di per sé. L'ho provato una volta ma è brutto (anche io ho usato jQuery ajax). Basta chiamare la pagina usando ajax con il nome del metodo aggiunto ad esso come parametro stringa di query e quindi sul lato server controllare il parametro e chiamare il metodo pertinente. Ma, come vi ho detto che è abbastanza brutto :(

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

sul lato server:.

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

OK ho capito ragazzi ... quindi ....................... hai un'altra soluzione come chiamare il metodo in serverside (aspx.cs) dal lato client (aspx) ragazzi ..... grazie 4 soluzione ...... – Pramulia

+0

@ theVillageldiot sei sicuro che sia solo brutto? o c'è qualcos'altro che non potremmo usare in questo modo? perché penso che questo modo di chiamare sia meglio che usare [metodo web] in qualsiasi modo. – vesna

1

In realtà, non si ottiene a chiamare i metodi non statici in questo modo

Quando si chiama un PageMethod, si sta fondamentalmente chiamando un servizio web speciale. Questa caratteristica funziona solo con metodi statici sulla stessa pagina.

+0

OK ho capito ragazzi ... così ....................... hai un'altra soluzione su come chiamare il metodo in serveride (aspx.cs) dal lato client (aspx) ragazzi ... grazie 4 soluzione ...... – Pramulia

-4

Dave ha scritto in dettaglio su chiamata metodi di pagine dal lato client usando jquery ajax. L'idea generale è come questa (se trovi qualche problema, fai riferimento al sito di Dave).

C# Codice:

[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

Ok ... grazie U ... – Pramulia

+4

non ha fatto la domanda originale chiedere metodi NON-statici ? –

+0

@Gordon non so perché ho risposto a questa domanda due volte! – TheVillageIdiot

0

come risposta alla Pramulia penso che si vuole avere una funzione con un argomento dal lato client che viene realizzato nell'esempio -> 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

Hai provato? –

+0

l'ho copiato da qualche sito Web Microsoft. funziona bene e ottiene una stringa dal lato server al lato client, tuttavia ho bisogno di una soluzione che attiva il metodo non statico serveride da un javascript. – Kubi

16

È possibile evitare il vincolo statico t usando una semplice pagina .asmx invece della pagina codebehind.

1) Aprire un sito web utilizzando l'AJAX Abilita modello di ASP.NET (mette i riferimenti necessari nel web.config)

2) SIMPLESERVICE.ASMX - Aggiungere un nuovo servizio web ASMX (ho chiamato il mio SimpleService.asmx) Notare la decorazione [System.Web.Script.Services.ScriptSerive] e che la classe SimpleService implementa 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 - Per usarlo riferimento al servizio in voi lo script manager e tu sei fuori e in esecuzione. Nel mio Javascript chiamo 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> 

ho usato l'esempio che ho trovato da Scott Gu Found Here.

+0

Ho provato questo e non funziona ..... Esiste uno strumento esterno che devo scaricare? –

+0

Sto cercando di fare qualcosa di simile a quanto sopra, ma non sono sicuro di quali tipi di parametri sono "permesso" di passare alla funzione del mio servizio Web dal lato JavaScript. In definitiva, mi piacerebbe passare l'oggetto Page, ma ottengo tutti i tipi di errori quando provo a farlo. Posso passare oggetti .NET, come le cose nello spazio dei nomi System.Web.UI.WebControls? – LeeCambl

+2

Nota che non dovresti più usare ASMX: si tratta di una tecnologia legacy, appena supportata a malapena. La stessa identica cosa può essere fatta con WCF. –

1

C#

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

JS/jQuery

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

puoi usare protetto invece che pubblico. – Mike

-1

Se si desidera chiamare utilizzando la stessa funzione , è possibile utilizzare il seguente codice:

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