web-dev-qa-db-fra.com

Appelez une méthode non statique côté serveur depuis le côté client à l'aide de JavaScript

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

Autant que je sache, je peux appeler une méthode statique côté serveur du côté client ...

du 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>

Ça marche. Maintenant, comment appeler une méthode non statique du côté client?

17
Pramulia

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

1) Ouvrez un nouveau site Web à l'aide du modèle AJAX Enable ASP.NET (il met les références nécessaires dans le fichier web.config).

2) SIMPLESERVICE.ASMX - Ajout d'un nouveau service Web .asmx (j'ai appelé le mien SimpleService.asmx) Notez la décoration [System.Web.Script.Services.ScriptSerive] et que 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, faites référence au 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 j'ai trouvé dans Scott Gu Found Here.

17
shawn deutch

Non, vous ne pouvez pas appeler de méthodes non statiques du côté client en tant que tel. Je l'ai essayé une fois mais c'est moche (j'ai aussi utilisé jQuery ajax). Appelez simplement la page en utilisant ajax avec le nom de la méthode qui lui 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 correspondante. Mais comme je vous l'ai dit, c'est assez moche :(

$.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;
        .....
        .....
    }
}
7
TheVillageIdiot

C #

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

JS/jQuery

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

En fait, vous ne pouvez pas appeler des méthodes non statiques de cette façon.

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

1
John Saunders

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);
}
1
Manoj Bhardwaj

en réponse à Pramulia , je pense que vous souhaitez une fonction avec un argument côté client implémentée 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
Kubi

J'ai fini par utiliser des champs cachés au cas où quelqu'un le lirait. Je peux définir la valeur dans c # sous une fonction, puis la lire en javascript.

0
Bbb