PageMethods не определяется на странице ASPX

Я смотрю на какой-то старый код, который я могу только считать выполненным за один раз.

MyPage.aspx:

function GetCompanyList(officeId) {
    var companyList = document.getElementById('<%= CompanyDropDown.ClientID %>');
    if (companyList.length == 0)
        PageMethods.GetCompanyList(officeId, OnGetCompanyList);
    else
        EditCompany();
}

И

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" />

Код позади:

[System.Web.Services.WebMethod()]
[System.Web.Script.Services.ScriptMethod()]
public IEnumerable<CompanyMinimum> GetCompanyList(int officeId) {
    return (
        from c in Repository.Query<Company>()
        where !c.IsDeleted && c.TypeEnumIndex == (short)CompanyRelationshipType.Hotel
        select new CompanyMinimum() {
            id = c.Id,
            desc = c.Description
        }
    ).ToList();
}

Но при вызове PageMethods.GetCompanyList() в первом фрагменте Chrome сообщает:

PageMethods не определен

Может ли кто-нибудь увидеть, что изменилось, чтобы это не сработало?

Примечание. Я нашел похожие вопросы, но все они были связаны с тем, что этот код не работает на главных страницах или пользовательских элементах управления, что здесь не так.

Ответы

Ответ 1

EnablePageMethods фактически взаимодействует только с методами подкласса Page, которые являются public, static и отнесены как WebMethod.

GetCompanyList имеет 2 из них и просто также должен быть static.

[System.Web.Services.WebMethod()]
[System.Web.Script.Services.ScriptMethod()]
public static IEnumerable<CompanyMinimum> GetCompanyList(int officeId) {
    // ...
}

И я подозреваю, что происходит, потому что он оставляет на стороне клиента PageMethods undefined, если он не находит никаких методов, которые имеют все 3.

Ответ 2

Вы можете вызвать ASP.NET AJAX Page Method с помощью jQuery, например:

$.ajax({
    type: "POST",
    url: "PageName.aspx/MethodName",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        // Do something interesting here.
    }
});

Ответ 3

Возможно, вы используете Маршрутизацию на своих страницах. то должен быть установлен реальный путь после вызова PageMethods:

PageMethods.set_path("<%=ResolveUrl("~/YourPage.aspx")%>");
PageMethods.YourMethod(param, OnSuccess, OnError);

Ответ 4

Один ответ из другого решения, которое, как мне кажется, должно быть представлено, - это если эта ошибка возникает на вашем сервере, но не локально - это поместить пустой файл-заполнитель MyPage.aspx, и теперь он также работает на рабочем сервере.