2009-09-01 5 views
15

Comment appeler une méthode non statique côté serveur (aspx.cs) en utilisant javascript (aspx) ....?Appeler une méthode non statique côté serveur à partir du client en utilisant JavsScript

Pour autant que je sais que je peux appeler la méthode statique côté serveur de côté client ...

côté serveur

:

[WebMethod] 
public static void method1() 
{ 
} 

côté client:

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

Il fonctionne. Maintenant, comment puis-je appeler la méthode non statique du côté client?

Répondre

7

Non, vous ne pouvez pas appeler des méthodes non statiques du côté client en soi. Je l'ai essayé une fois mais c'est moche (aussi j'ai utilisé jQuery ajax). Il suffit d'appeler la page en utilisant ajax avec le nom de la méthode qui y est ajouté en tant que paramètre de chaîne de requête, puis, côté serveur, vérifiez le paramètre et appelez la méthode appropriée. Mais comme je vous l'ai dit, il est assez laid :(

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

côté serveur.

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, je l'ai eu les gars ... donc ....................... avez-vous une autre solution comment appeler la méthode dans le côté serveur (aspx.cs) du côté client (aspx) les gars ..... merci 4 solution ...... – Pramulia

+0

@theVillageldiot êtes-vous sûr que c'est juste moche? ou il y a toute autre chose que nous ne devrions pas utiliser de cette façon? parce que je pense que cette façon d'appeler est mieux que d'utiliser [méthode web] .thanks de toute façon. – vesna

1

En fait, vous ne recevez pas d'appeler des méthodes non statiques de cette façon

Lorsque vous appelez un PageMethod, vous appelez essentiellement un service Web spécial. Cette fonction ne fonctionne qu'avec des méthodes statiques sur la même page.

+0

OK, je l'ai eu les gars ... alors ....................... avez-vous une autre solution comment appeler la méthode dans les serveurs (aspx.cs) du côté client (aspx) les gars ..... merci 4 solution ...... – Pramulia

-4

Dave a écrit en détail sur appel des méthodes de la page du côté client en utilisant jquery ajax. L'idée générale est comme ceci (si vous trouvez un problème s'il vous plaît se référer au site de Dave).

code 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

Ok ... merci U ...... – Pramulia

+4

n'a pas la question d'origine, poser des questions sur des méthodes non-statiques ? –

+0

@Gordon ne sais pas pourquoi j'ai répondu à cette question deux fois! – TheVillageIdiot

0

comme une réponse à Pramulia je pense que vous voulez avoir une fonction avec un argument du côté client qui est mis en œuvre dans l'exemple -> 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

Avez-vous essayé? –

+0

J'ai copié cela à partir de certains sites Web de Microsoft. cela fonctionne bien et obtient une chaîne de côté serveur à côté de client mais j'ai besoin d'une solution qui déclenche la méthode non statique de serveur d'un javascript. – Kubi

16

Vous pouvez éviter la contrainte statique t en utilisant une simple page .asmx au lieu de la page codebehind.

1) Ouvrir un nouveau site Web en utilisant l'AJAX Activer modèle ASP.NET (il met les références nécessaires dans le web.config)

2) SIMPLESERVICE.ASMX - Ajouter un nouveau service Web .asmx (j'ai appelé le mien SimpleService.asmx) Remarquez la décoration [System.Web.Script.Services.ScriptSerive] et la classe SimpleService implémente 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 - Pour l'utiliser, référencez le service dans votre gestionnaire de scripts et vous êtes opérationnel. Dans mon Javascript, j'appelle 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> 

J'ai utilisé l'exemple que je trouve de Scott Gu Found Here.

+0

J'ai essayé ceci et cela ne fonctionne pas ..... Y at-il un outil externe que je dois le faire télécharger? –

+0

Je cherche à faire quelque chose comme ce qui précède, mais je ne suis pas sûr du type de paramètres que je suis "autorisé" à passer à ma fonction de service Web du côté JavaScript. En fin de compte, j'aimerais passer l'objet Page, mais j'obtiens toutes sortes d'erreurs quand j'essaye de le faire. Puis-je transmettre des objets .NET, comme des choses dans l'espace de noms System.Web.UI.WebControls? – LeeCambl

+2

Notez que vous ne devriez plus utiliser ASMX - c'est une technologie héritée, à peine prise en charge. La même chose peut être faite avec WCF. –

1

C#

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

JS/jQuery

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

vous pouvez utiliser protégé au lieu de public. – Mike

-1

Si vous voulez l'appeler en utilisant la même fonction , vous pouvez utiliser le code suivant:

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