2009-05-20 14 views
34

Sto provando a chiamare un metodo lato server dal lato client tramite jQuery. Il mio codice è il seguente:Chiamare un metodo lato server ASP.NET tramite jQuery

lato server:

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

lato 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; 
}); 

ho aggiunto un punto di rottura sul metodo SendMessage lato server, ma non è mai colpendolo, ma quando eseguo il codice viene chiamato il metodo di successo jQuery. Cosa potrebbe causare questo? `

+0

e il codice all'interno di SendMessage non è in esecuzione o non è possibile eseguirne il debug? –

+0

Entrambi, il codice SendMessage non è in esecuzione e non riesco a eseguirne il debug. – Fermin

+0

Il vostro metodo lato server è in realtà una pagina ASPX e non il servizio Web ASMX o WCF? L'URL punta alla pagina Web di aspx. –

risposta

36

Per chiamare ASP.NET AJAX "ScriptServices" e ai metodi di pagina, è necessario utilizzare l'intero $ .ajax() sintassi:

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

Vedere questo post per i dettagli sul motivo per cui è necessario: http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/

Modifica: l'estensione non cambia in .asmx ma rimane .aspx.

+4

Funzionava, solo la differenza su questo codice è l'url era MessagePopup.aspx, non asmx. Grazie ragazzi. – Fermin

+0

@Dave Ward: grazie mille per aver creato esempi che funzionino subito fuori dagli schemi! – delliottg

+0

Puoi fornire alcune informazioni sul mio problema: http://stackoverflow.com/questions/41752213/why-is-asmx-giving-an-error-when-pulling-data-using-client-script. Grazie. Il mio è un '.asmx' – Si8

2

È necessario utilizzare il servizio Web anziché la normale pagina Web di aspx. Le pagine Web non supportano i metodi web, credo che la tua richiesta jQuery carichi la pagina HTML. Vi suggerisco due cose:

  1. Utilizzare Fiddler2 (con IE) o HttpFox (con Firefox) per eseguire il debug di richieste e risposte AJAX sul lato client.
  2. Utilizzare il servizio Web WCF sul lato server. in questo caso è possibile utilizzare SvcConfigEditor e SvcTraceViewer per configurare e eseguire il debug dei metodi Web sul lato server.
+0

Perché dici WCF piuttosto che ASMX? – Fermin

+0

WCF è ora la tecnologia di comunicazione primaria e consigliata per .NET. Ha un sacco di funzionalità sui servizi Web asmx, una migliore testabilità (Google per "Unit test WCF services"). Strategicamente, la WCF è una scelta giusta per imparare. Controlla questo post per ulteriori informazioni su asmx vs WCF: http://social.msdn.microsoft.com/Forums/en-US/dotnetstocktradersampleapplication/thread/048d8a45-dad8-431f-886c-9aae78862285 –

+0

Inoltre, puoi controllare le prestazioni di Microsoft benchmarks: http://msdn.microsoft.com/en-us/library/bb310550.aspx –

9

Sembra che tu stia cercando di utilizzare un metodo di pagina.

dare uno sguardo qui Page Methods in ASP.NET Ajax aiuto

+0

Non conoscevo Metodi di pagina +1 –

1

Ecco un codice che potrebbe funzionare nella vostra situazione.

<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); 
     } 

Ci

è un esempio che ha sempre funzionato per me.

Ecco l'articolo completo http://www.webdeveloperpost.com/Articles/How-to-use-jquery-ajax-in-asp-dot-net-web-page.aspx

Funziona bene per coloro che vogliono un modo dritto in avanti di utilizzare il metodo asp.net chiamata jQuery indietro

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); } 
    }); 

Se questo non funziona .. .e dà "errore di sintassi: errore di sintassi" ... quindi aggiungere questo

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

tra </compilation> e </system.web> nel file web.config.

Spero che questo aiuti qualcuno perché mi ci è voluto un po 'per capire che oltre alla funzione jquery devo aggiungerlo in Web.Config.

Problemi correlati