2009-05-20 6 views
34

Próbuję wywołać metodę po stronie serwera od strony klienta za pośrednictwem jQuery. Mój kod wygląda następująco:Wywołanie metody po stronie serwera ASP.NET za pośrednictwem jQuery

po stronie serwera:

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

po stronie klienta:

$("#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; 
}); 

Dodałem punkt załamania po stronie serwera metodę SendMessage, ale to nigdy nie trafiając go, ale po uruchomieniu kodu wywoływana jest metoda sukcesu jQuery. Co może być przyczyną tego? `

+0

i kod wewnątrz SendMessage nie działa lub po prostu nie można go debugować? –

+0

Oba kody SendMessage nie są uruchomione i nie można ich debugować. – Fermin

+0

Czy Twoja metoda po stronie serwera to naprawdę strona ASPX, a nie ASMX lub usługa WWW WCF? Adres URL wskazuje na stronę internetową aspx. –

Odpowiedz

36

Aby połączyć ASP.NET AJAX "ScriptServices" oraz metod strony, trzeba korzystać z pełnej $ .ajax() składnia:

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

Zobacz to po szczegóły, dlaczego jest to konieczne: http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/

Edytuj: Rozszerzenie nie zmienia się na .asmx, ale pozostaje .aspx.

+4

Rozumiem, że działa, tylko różnica w tym kodzie to adres URL: MessagePopup.aspx, nie asmx. Dzięki chłopaki. – Fermin

+0

@Dave Ward: bardzo dziękuję za tworzenie przykładów, które działają od razu po wyjęciu z pudełka! – delliottg

+0

Czy możesz podać kilka informacji na temat mojego problemu: http://stackoverflow.com/questions/41752213/why-is-asmx-giving-an-error-when-pulling-data-using-client-script. Dzięki. Mój jest ".asmx" – Si8

2

Powinieneś używać usługi internetowej zamiast zwykłej strony internetowej aspx. Strony internetowe nie mają wsparcia dla wywoływania metod internetowych, wierzę, że twoje żądanie jQuery ładuje stronę HTML. Proponuję dwie rzeczy:

  1. Użyj Fiddler2 (z IE) lub HttpFox (z Firefoksem) do debugowania żądań i odpowiedzi AJAX po stronie klienta.
  2. Użyj usługi WWW WCF po stronie serwera. w tym przypadku można używać SvcConfigEditor i SvcTraceViewer do konfigurowania i debugowania metod sieci po stronie serwera.
+0

Dlaczego mówisz WCF zamiast ASMX? – Fermin

+0

WCF jest teraz podstawową i zalecaną technologią komunikacyjną dla .NET. Ma mnóstwo możliwości w porównaniu z serwisami internetowymi ASMX, lepszą testowalność (Google dla "testowania usług WCF"). Strategicznie, WCF jest właściwym wyborem do nauki. Sprawdź ten post, aby dowiedzieć się więcej o ASMX vs WCF: http://social.msdn.microsoft.com/Forums/en-US/dotnetstocktradersampleaplikacja/thread/048d8a45-dad8-431f-886c-9aae78862285 –

+0

Możesz także sprawdzić wydajność Microsoft testy porównawcze: http://msdn.microsoft.com/en-us/library/bb310550.aspx –

9

Wygląda na to, że próbujesz skorzystać z metody strony.

Spójrz tutaj Page Methods in ASP.NET Ajax o pomoc

+0

Nie wiedziałem o metodach strony +1 –

1

Oto kod, który może działać w Twojej sytuacji.

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

Nie

jest przykładem, że zawsze działa na mnie.

Oto pełna artykuł http://www.webdeveloperpost.com/Articles/How-to-use-jquery-ajax-in-asp-dot-net-web-page.aspx

To działa dobrze dla tych, którzy chcą prosty sposób za pomocą jquery asp.net metodę oddzwonię

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

Jeśli to nie działa .. .i daje „błąd składni: błąd składni” ... następnie dodać ten

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

między </compilation> i </system.web> w pliku web.config.

Mam nadzieję, że to pomoże komuś, ponieważ zajęło mi trochę czasu, aby dowiedzieć się, że obok funkcji jquery muszę dodać to w Web.Config.