2009-05-20 10 views
34

Estoy tratando de llamar a un método del lado del servidor desde el lado del cliente a través de jQuery. Mi código es el siguiente:Llamar a un método del lado del servidor ASP.NET a través de jQuery

lado del servidor:

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

lado del cliente:

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

He añadido un punto de quiebre en el método SendMessage lado del servidor, pero nunca es golpeándola, pero cuando ejecuto el código, se llama al método de éxito jQuery. ¿Qué podría estar causando esto? `

+0

y el código dentro de SendMessage no se está ejecutando, o simplemente no puede depurarlo? –

+0

Ambos, el código SendMessage no se está ejecutando y no puedo depurarlo. – Fermin

+0

¿Su método del servidor es realmente una página ASPX y no un servicio web ASMX o WCF? La URL apunta a la página web de aspx. –

Respuesta

36

Para llamar a ASP.NET AJAX "ScriptServices" ya los métodos de página, es necesario utilizar los $ .ajax llena() Sintaxis:

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

Ver este publicar para obtener detalles sobre por qué es necesario: http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/

Editar: La extensión no cambia a .asmx pero sigue siendo .aspx.

+4

Lo tengo funcionando, la única diferencia en este código es que la url era MessagePopup.aspx, no asmx. Gracias chicos. – Fermin

+0

@Dave Ward: ¡muchas gracias por hacer ejemplos que funcionan desde el primer momento! – delliottg

+0

¿Podría proporcionar algunas ideas sobre mi problema ?: http://stackoverflow.com/questions/41752213/why-is-asmx-giving-an-error-when-pulling-data-using-client-script. Gracias. El mío es un '.asmx' – Si8

2

Debe utilizar el servicio web en lugar de la página web aspx regular. Las páginas web no tienen soporte para llamar a los métodos web, creo que su solicitud de jQuery carga la página HTML. Te sugiero dos cosas:

  1. Uso Fiddler2 (con Internet Explorer) o HttpFox (con Firefox) para depurar las peticiones AJAX y respuestas en el lado del cliente.
  2. Utilice el servicio web WCF en el lado del servidor. en este caso, puede usar SvcConfigEditor y SvcTraceViewer para configurar y depurar métodos web en el lado del servidor.
+0

¿Por qué dices WCF en lugar de ASMX? – Fermin

+0

WCF es ahora la tecnología de comunicación primaria y recomendada para .NET. Tiene un montón de capacidades sobre servicios web de asmx, mejor capacidad de prueba (Google para "Pruebas unitarias de servicios WCF"). Estratégicamente, WCF es una buena opción para aprender. Consulte esta publicación para obtener más información sobre asmx vs WCF: http://social.msdn.microsoft.com/Forums/en-US/dotnetstocktradersampleapplication/thread/048d8a45-dad8-431f-886c-9aae78862285 –

+0

Además, puede verificar el rendimiento de Microsoft puntos de referencia: http://msdn.microsoft.com/en-us/library/bb310550.aspx –

9

Parece que estás intentando utilizar un método de página.

Echa un vistazo aquí Page Methods in ASP.NET Ajax ayuda

+0

No sabía acerca de Métodos de página +1 –

1

Aquí hay un código que podría funcionar en su caso.

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

Hay un ejemplo que siempre ha trabajar para mí.

Aquí está el artículo completo http://www.webdeveloperpost.com/Articles/How-to-use-jquery-ajax-in-asp-dot-net-web-page.aspx

Funciona bien para aquellos que quieren una manera directa de la utilización de la jquery asp.net método de devolución de llamada

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 esto no funciona .. .y da "error de sintaxis: error de sintaxis" ... a continuación, añadir esta

<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> y </system.web> en el archivo Web.config.

Espero que esto ayude a alguien porque me tomó un tiempo darme cuenta de que junto a la función jquery tengo que agregar eso en Web.Config.

Cuestiones relacionadas