2009-05-20 34 views
34

Tôi đang cố gắng gọi một phương thức phía máy chủ từ phía máy khách thông qua jQuery. Mã của tôi là như sau:Gọi phương thức bên máy chủ ASP.NET qua jQuery

Server side:

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

Khách hàng bên:

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

Tôi đã thêm một điểm break trên máy chủ bên phương pháp SendMessage, nhưng nó không bao giờ đánh nó, nhưng khi tôi chạy mã, phương thức thành công jQuery được gọi. Điều gì có thể gây ra điều này? '

+0

và mã bên trong SendMessage không chạy hoặc không thể gỡ lỗi? –

+0

Cả hai, mã SendMessage không chạy và tôi không thể gỡ lỗi nó. – Fermin

+0

Phương pháp bên máy chủ của bạn có thực sự là trang ASPX chứ không phải dịch vụ web ASMX hoặc WCF không? URL trỏ tới trang web aspx. –

Trả lời

36

Để gọi ASP.NET AJAX "ScriptServices" và phương pháp trang, bạn cần phải sử dụng $ .ajax đầy đủ() Cú pháp:

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

Xem này đăng để biết chi tiết về lý do cần thiết: http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/

Chỉnh sửa: Tiện ích không thay đổi thành .asmx nhưng vẫn giữ .aspx.

+4

Có hoạt động, chỉ khác biệt trên mã này là url là MessagePopup.aspx, chứ không phải asmx. Cảm ơn các bạn. – Fermin

+0

@Dave Ward: cảm ơn rất nhiều vì đã tạo ra các ví dụ hoạt động ngay tức khắc! – delliottg

+0

Bạn có thể vui lòng cung cấp một số thông tin chi tiết về vấn đề của tôi không: http://stackoverflow.com/questions/41752213/why-is-asmx-giving-an-error-when-pulling-data-using-client-script. Cảm ơn. Mỏ là một '.asmx' – Si8

2

Bạn nên sử dụng dịch vụ web thay vì trang web aspx thông thường. Các trang web không hỗ trợ gọi các phương thức web, tôi tin rằng yêu cầu jQuery của bạn sẽ tải trang HTML thay thế. Tôi đề nghị bạn hai điều:

  1. Sử dụng Fiddler2 (có IE) hoặc HttpFox (với Firefox) để gỡ lỗi các yêu cầu và phản hồi AJAX trên phía máy khách.
  2. Sử dụng dịch vụ web WCF ở phía máy chủ. trong trường hợp này, bạn có thể sử dụng SvcConfigEditorSvcTraceViewer để định cấu hình và gỡ lỗi các phương pháp web ở phía máy chủ.
+0

Tại sao bạn nói WCF thay vì ASMX? – Fermin

+0

WCF hiện là công nghệ truyền thông chính và được khuyến nghị cho .NET. Nó có rất nhiều khả năng trên dịch vụ web asmx, khả năng kiểm tra tốt hơn (Google cho "Đơn vị kiểm tra dịch vụ WCF"). Chiến lược, WCF là lựa chọn đúng đắn để học. Kiểm tra bài đăng này để biết thêm về asmx vs WCF: http://social.msdn.microsoft.com/Forums/en-US/dotnetstocktradersampleapplication/thread/048d8a45-dad8-431f-886c-9aae78862285 –

+0

Ngoài ra, bạn có thể kiểm tra hiệu suất của Microsoft điểm chuẩn: http://msdn.microsoft.com/en-us/library/bb310550.aspx –

9

Dường như bạn đang cố gắng tận dụng phương pháp trang.

Hãy xem ở đây Page Methods in ASP.NET Ajax để được giúp đỡ

+0

Tôi không biết về Phương thức Trang +1 –

1

Đây là mã có thể hoạt động trong tình huống của bạn.

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

Có một ví dụ mà đã luôn luôn làm việc cho tôi.

Dưới đây là hoàn chỉnh bài viết http://www.webdeveloperpost.com/Articles/How-to-use-jquery-ajax-in-asp-dot-net-web-page.aspx

Nó hoạt động tốt cho những người muốn có một cách thẳng về phía trước của việc sử dụng jquery asp.net gọi phương thức lại

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

Nếu điều này không làm việc .. .và cho "cú pháp lỗi: lỗi cú pháp" ... sau đó thêm này

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

giữa </compilation></system.web> trong file Web.Config của bạn.

Hy vọng điều này sẽ giúp ai đó vì đã cho tôi một thời gian để tìm ra rằng bên cạnh hàm jquery tôi phải thêm vào trong Web.Config.

Các vấn đề liên quan