web-dev-qa-db-fra.com

Appel d'une méthode côté serveur ASP.NET via jQuery

J'essaie d'appeler une méthode côté serveur du côté client via jQuery. Mon code est le suivant:

Du côté serveur:

    using System.Web.Services;
    [WebMethod()]
    //[ScriptMethod()]
    public static void SendMessage(string subject, string message, string messageId, string pupilId)
    {
        //Send message
    }

Côté client:

$("#btnSendMessage").live("click", function(){
  var subject = $("#tbSubject").val();
  var message = $("#tbMessage").val();
  var messageId = $("#hdnMessageId").val();
  var pupilId = $("#hdnPupilId").val();

  $.ajax({
      type: "POST",
      url: "./MessagePopup.aspx/SendMessage",
      data: ("subject=" + subject + "&message=" + message + "&messageId=" + messageId + "&pupilId=" + pupilId),
      error: function(XMLHttpRequest, textStatus, errorThrown){
          alert(textStatus);
      },
      success: function(result){
         alert("success");
      }
   });
   return false;
});

J'ai ajouté un point d'arrêt sur la méthode SendMessage côté serveur, mais il ne le frappe jamais, mais lorsque j'exécute le code, la méthode de réussite jQuery est appelée. Qu'est-ce qui pourrait causer cela?

35
Fermin

Pour appeler ASP.NET AJAX "ScriptServices" et les méthodes de page, vous devez utiliser la syntaxe complète de $ .ajax ():

$.ajax({
  type: "POST",
  url: "MessagePopup.aspx/SendMessage",
  data: "{subject:'" + subject + "',message:'" + message + ",messageId:'" + messageId + "',pupilId:'" + pupilId +"'}",
  contentType: "application/json; charset=utf-8",
  dataType: "json",
  success: function(msg) {
    // Do something interesting here.
  }
});

Voir cet article pour plus de détails sur les raisons pour lesquelles cela est nécessaire: http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/

Modifier: l'extension ne change pas en .asmx mais reste .aspx.

37
Dave Ward

Il semble que vous essayiez d'utiliser une méthode de page.

Jetez un œil ici Méthodes de page dans ASP.NET Ajax pour obtenir de l'aide

9
Stephen Newman
$.ajax({  
        type: "POST",  
        url: "MessagePopup.aspx/SendMessage",  
        data: "{subject:'" + subject + "',message:'" + message + ",messageId:'" + messageId + "',pupilId:'" + pupilId +"'}",  
        async: true,  
        cache: false,  
        contentType: "application/json; charset=utf-8",  
        dataType: "json",  
        success: function() {},  
        error:function (xhr, ajaxOptions, thrownError){ alert(thrownError); }  
     });

Si cela ne fonctionne pas ... et donne "Erreur de syntaxe: erreur de syntaxe" ... alors ajoutez ceci

<httpHandlers>
            <remove verb="*" path="*.asmx"/>
            <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
            <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory,
System.Web.Extensions, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35"/>
            <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler,
System.Web.Extensions, Version=3.5.0.0, Culture=neutral,
PublicKeyToken=31BF3856AD364E35" validate="false"/>
        </httpHandlers>
        <httpModules>
            <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions,
Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        </httpModules>

entre </compilation> et </system.web> dans votre fichier Web.Config.

J'espère que cela aidera quelqu'un, car il m'a fallu un certain temps pour comprendre qu'à côté de la fonction jquery, je dois ajouter cela dans Web.Config.

2
Frank

Vous devez utiliser le service Web au lieu de la page Web aspx standard. Les pages Web ne prennent pas en charge les méthodes Web, je pense que votre requête jQuery charge la page HTML à la place. Je vous suggère deux choses:

  1. Utilisez Fiddler2 (avec IE) ou HttpFox (avec Firefox) pour déboguer AJAX requêtes et réponses côté client.
  2. Utilisez le service Web WCF côté serveur. dans ce cas, vous pouvez utiliser SvcConfigEditor et SvcTraceViewer pour configurer et déboguer les méthodes Web côté serveur.
2
Artem Koshelev

Voici le code qui pourrait fonctionner dans votre situation.

<script type="text/javascript">
    $(document).ready(function () {

        // Add the page method call as an onclick handler for the button.
        $("#btnSubmit").click(function () {

            //get the string from the textbox
            $.ajax({

                type: "POST",
                url: "testSearch.aspx/GetMyShippingDate",
                contentType: "application/json; charset=utf-8",
                data: "{'tracking_num': '" + $("#txtTrackingNumber").val() + "'}",  
                dataType: "json",
                success: function (date) {

                    // Replace the div's content with the page method's return.
                    Success(date);

                },
                error: Failed
            });
        });
    });

     function Success(result) {  
          $("#ParcelShippingDate").html(result.d);
      }  
      function Failed(result) {  
          alert(result.status + " " + result.statusText);  
      }  

Il y a un exemple qui a toujours fonctionné pour moi.

Voici l'article complet http://www.webdeveloperpost.com/Articles/How-to-use-jquery-ajax-in-asp-dot-net-web-page.aspx

Cela fonctionne bien pour ceux qui veulent un moyen simple d'utiliser la méthode jquery asp.net call back

1
Junimation