Search code examples
javascriptasp.netajaxpagemethods

PageMethods is not Defined in ASPX Page


I'm looking at some old code that I can only assume worked at one time.

MyPage.aspx:

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

And:

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

Code behind:

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

But at the call to PageMethods.GetCompanyList() in the first snippet, Chrome reports:

PageMethods is not defined

Can anyone see what has changed to prevent this from working?

Note: I've found similar questions but they all seemed related to this code not working in master pages or user controls, which isn't the case here.


Solution

  • EnablePageMethods actually only interacts with methods of a Page subclass that are public, static, and attributed as a WebMethod.

    GetCompanyList has 2 of those and just also needs to be static.

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

    And, I suspect what's happening is that it's leaving PageMethods undefined client-side if it doesn't find any methods that have all 3.