2009-05-20 4 views
34

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

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 de rupture sur le côté serveur méthode SendMessage, mais il n'a jamais frapper, mais quand j'exécute le code, la méthode de succès jQuery est appelée. Qu'est-ce qui peut être à l'origine de ce problème? `

+0

et le code dans le SendMessage n'est pas en cours d'exécution, ou tout simplement ne peut pas le déboguer? –

+0

Les deux, le code SendMessage n'est pas en cours d'exécution et je ne peux pas le déboguer. – Fermin

+0

Votre méthode côté serveur est-elle réellement une page ASPX et non un service Web ASMX ou WCF? L'URL pointe vers la page Web aspx. –

Répondre

36

Pour appeler ASP.NET AJAX "ScriptServices" et les méthodes de page, vous devez utiliser le .ajax complet $() Syntaxe:

$.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 cette 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/

Éditer: L'extension ne change pas en .asmx mais reste .aspx.

+4

Je l'ai fait fonctionner, seule différence sur ce code est l'url était MessagePopup.aspx, pas asmx. Merci les gars. – Fermin

+0

@Dave Ward: merci beaucoup de faire des exemples qui fonctionnent dès la sortie de la boîte! – delliottg

+0

Pouvez-vous s'il vous plaît fournir quelques idées sur mon problème: http://stackoverflow.com/questions/41752213/why-is-asmx-giving-an-error-when-pulling-data-using-client-script. Merci. Le mien est un '.asmx' – Si8

2

Vous devez utiliser le service Web au lieu de la page Web aspx standard. Les pages Web ne supportent pas les méthodes Web, je crois 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 les requêtes AJAX et les 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.
+0

Pourquoi dites-vous WCF plutôt qu'ASMX? – Fermin

+0

WCF est désormais la technologie de communication principale et recommandée pour .NET. Il a une tonne de capacités sur les services Web asmx, une meilleure testabilité (Google pour "tests unitaires des services WCF"). Stratégiquement, WCF est un bon choix à apprendre. Consultez cet article pour en savoir plus sur asmx vs WCF: http://social.msdn.microsoft.com/Forums/en-US/dotnetstocktradersampleapplication/thread/048d8a45-dad8-431f-886c-9aae78862285 –

+0

En outre, vous pouvez vérifier les performances de Microsoft benchmarks: http://msdn.microsoft.com/en-us/library/bb310550.aspx –

9

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

Jetez un coup d'oeil ici Page Methods in ASP.NET Ajax aide

+0

Je ne savais pas sur les méthodes de la page +1 –

1

Voici un 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 est un exemple qui fonctionne toujours pour moi.

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

Il fonctionne bien pour ceux qui veulent aller de l'avant droit d'utiliser l'appel de la méthode asp.net jquery retour

2
$.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 .. .and donne "erreur de syntaxe: erreur de syntaxe" ... puis ajoutez ce

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

Espérons que cela aidera quelqu'un parce que cela m'a pris un certain temps pour comprendre qu'à côté de la fonction jquery je dois l'ajouter dans Web.Config.

Questions connexes