Убедитесь, что вы включили методы страницы в элементе ScriptManager
:
<asp:ScriptManager ID="scm" runat="server" EnablePageMethods="true" />
и что вы отменили действие кнопки по умолчанию, вернув false в обработчике onclick, в противном случае страница выполняет полную обратную передачу, и ваш вызов AJAX может никогда не успеть завершиться. Вот полный рабочий пример:
<%@ Page Language="C#" %>
<script type="text/c#" runat="server">
[System.Web.Services.WebMethod]
public static string search()
{
return "worked";
}
</script>
<!DOCTYPE html>
<html>
<head id="Head1" runat="server">
<title></title>
</head>
<body>
<form id="Form1" runat="server">
<asp:ScriptManager ID="scm" runat="server" EnablePageMethods="true" />
<button id="btnSearch" onclick="search(); return false;" >Search</button>
</form>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/javascript">
function search() {
$.ajax({
type: 'POST',
url: '<%= ResolveUrl("~/default.aspx/search") %>',
data: '{ }',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (msg) {
alert(msg.d)
}
});
}
</script>
</body>
</html>
Другая возможность - незаметно подписаться на обработчик кликов:
<button id="btnSearch">Search</button>
, а затем внутри отдельного файла JavaScript:
$('#btnSearch').click(function() {
$.ajax({
type: 'POST',
url: '<%= ResolveUrl("~/default.aspx/search") %>',
data: '{ }',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
success: function (msg) {
alert(msg.d)
}
});
return false;
});
Вы также можете заметить использование свойства msg.d
внутри обратного вызова success, которое ASP.NET использует для переноса всего ответа, а также использование метода ResolveUrl
для правильной генерации URL-адреса для метода page вместо жесткого кодирования.