Ответ 1
Убедитесь, что вы активировали методы страницы в элементе ScriptManager
:
<asp:ScriptManager ID="scm" runat="server" EnablePageMethods="true" />
и что вы отменили действие по умолчанию кнопки, возвратив ложь внутри обработчика 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
внутри обратного вызова успеха, который ASP.NET использует для переноса всего ответа, а также использования метода ResolveUrl
для правильного создания URL-адреса для метода страницы вместо жесткого кодирования.