通过 jQuery 调用 ASP.NET 服务器端方法
Posted
技术标签:
【中文标题】通过 jQuery 调用 ASP.NET 服务器端方法【英文标题】:Calling an ASP.NET server side method via jQuery 【发布时间】:2010-10-27 13:53:33 【问题描述】:我正在尝试通过 jQuery 从客户端调用服务器端方法。我的代码如下:
服务器端:
using System.Web.Services;
[WebMethod()]
//[ScriptMethod()]
public static void SendMessage(string subject, string message, string messageId, string pupilId)
//Send message
客户端:
$("#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;
);
我在服务器端的 SendMessage 方法上添加了一个断点,但它从来没有命中它,但是当我运行代码时,会调用 jQuery 成功方法。这可能是什么原因造成的?`
【问题讨论】:
SendMessage 中的代码没有运行,或者无法调试? 两者,SendMessage 代码没有运行,我无法调试它。 您的服务器端方法真的是 ASPX 页面,而不是 ASMX 或 WCF Web 服务吗? URL 指向 aspx 网页。 是的,我的服务器端方法在 ASPX 页面内,我应该创建一个单独的 ASMX 还是 WCF 网络服务? 【参考方案1】:要调用 ASP.NET AJAX“ScriptServices”和页面方法,您需要使用完整的 $.ajax() 语法:
$.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.
);
有关为什么需要这样做的详细信息,请参阅此帖子:http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/
编辑:扩展名不会更改为 .asmx,但仍然是 .aspx。
【讨论】:
搞定了,这段代码的唯一区别是 url 是 MessagePopup.aspx,而不是 asmx。谢谢大家。 @Dave Ward:非常感谢您提供开箱即用的示例! 您能否就我的问题提供一些见解:***.com/questions/41752213/…。谢谢。我的是.asmx
【参考方案2】:
您似乎正在尝试使用页面方法。
在这里查看Page Methods in ASP.NET Ajax 寻求帮助
【讨论】:
我不知道页面方法 +1【参考方案3】:您应该使用网络服务而不是常规的 aspx 网页。网页不支持调用 web 方法,我相信您的 jQuery 请求会加载 html 页面。我建议你两件事:
-
使用 Fiddler2(带 IE)或 HttpFox(带 Firefox)在客户端调试 AJAX 请求和响应。
在服务器端使用 WCF Web 服务。在这种情况下,您可以使用 SvcConfigEditor 和 SvcTraceViewer 在服务器端配置和调试 Web 方法。
【讨论】:
为什么说 WCF 而不是 ASMX? WCF 现在是 .NET 的主要和推荐的通信技术。它比 asmx web servives 拥有大量的功能,更好的可测试性(Google for "Unit testing WCF services")。从战略上讲,WCF 是学习的正确选择。查看这篇文章了解更多关于 asmx 与 WCF 的信息:social.msdn.microsoft.com/Forums/en-US/… 另外,您可以查看 Microsoft 性能基准测试:msdn.microsoft.com/en-us/library/bb310550.aspx【参考方案4】:$.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);
);
如果这不起作用...并给出“语法错误:语法错误”...然后添加此
<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>
在您的 Web.Config 文件中的 </compilation>
和 </system.web>
之间。
希望这会对某人有所帮助,因为我花了一段时间才弄清楚除了 jquery 函数之外,我必须在 Web.Config 中添加它。
【讨论】:
【参考方案5】:以下代码可能适用于您的情况。
<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);
有一个例子一直对我有用。
这里是完整的文章http://www.webdeveloperpost.com/Articles/How-to-use-jquery-ajax-in-asp-dot-net-web-page.aspx
它非常适合那些想要直接使用 jquery asp.net 方法回调的人
【讨论】:
以上是关于通过 jQuery 调用 ASP.NET 服务器端方法的主要内容,如果未能解决你的问题,请参考以下文章
通过 PageMethods 和 AJAX 调用将 JQuery 脚本错误记录到 ASP.NET 服务器
在后端 ASP.NET MVC (MEF) 上发布/绑定多个表单