在ASPX页面中未定义PageMethods

23

我正在查看一些旧代码,我只能假设它曾经起作用。

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未定义

有人能看出是什么改变导致这个无法工作了吗?

注意:我发现类似的问题,但它们似乎都与此代码不能在主页面或用户控件中工作有关,而这里并非如此。

4个回答

29

EnablePageMethods 实际上只与标记为 WebMethodpublicstaticPage 子类方法进行交互。

GetCompanyList 满足其中两个条件,只需将其改为static即可。

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

我猜测发生的情况是,如果找不到任何具有这三个方法的方法,则在客户端使PageMethods未定义。


你对该方法需要是“静态”的观点肯定是正确的,但如果没有有效的页面方法,我不确定它是否会抱怨 JavaScript 代理被“未定义”。 - Karl Anderson
@KarlAnderson:正在尝试确认。 - Jonathan Wood
是的,这似乎是问题所在。我找到了一段时间前我们重构代码时从静态变为非静态的地方。虽然我还没有一个静态版本可用,但现在我得到了一个不同于之前的错误。谢谢! - Jonathan Wood

5
您可以通过jQuery调用ASP.NET AJAX页面方法,如下所示:
$.ajax({
    type: "POST",
    url: "PageName.aspx/MethodName",
    data: "{}",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(msg) {
        // Do something interesting here.
    }
});

抱歉,在我的第二个片段中粘贴了错误的代码。是的,EnablePageMethods 已设置为 true。我熟悉从 MVC 中使用 $.ajax(),但仍然很希望能够在不重写的情况下使此代码工作。 - Jonathan Wood
1
你正在使用的Chrome版本可能存在问题,而由ASP.NET AJAX生成的JavaScript代码,jQuery将为您提供更好的跨浏览器体验,但我理解您想让它工作的愿望。它在IE和/或Firefox中工作吗? - Karl Anderson
在IE上产生相同的结果。看起来可能在较旧版本的Firefox上运行正常。 - Jonathan Wood
在你将该方法更改为静态方法之前,如果你使用jQuery的.ajax()函数,它是否会给你相同的错误? - Karl Anderson

2

也许你正在页面中使用路由。在调用PageMethods之后,必须设置真实路径:

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

0

我认为应该提供另一个解决方案中的一个答案,即如果此错误在服务器上发生但在本地未发生,则是将空的MyPage.aspx占位符文件放置在那里,现在它也可以在生产服务器上正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接