2013-08-14 12 views
14

Sto guardando un vecchio codice che posso solo assumere funzionato in una volta.PageMethods non è definito in ASPX Pagina

MyPage.aspx:

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

E:

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

codice dietro:

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

Ma al cal l per PageMethods.GetCompanyList() nel primo frammento, Chrome riporta:

PageMethods non è definita

Chiunque può vedere che cosa è cambiato per evitare che ciò di lavoro?

Nota: ho trovato domande simili ma sembravano tutte correlate a questo codice non funzionante in pagine master o controlli utente, che non è il caso qui.

risposta

18

EnablePageMethods realtà interagisce solo con i metodi di una sottoclasse Page che sono public, static, e attribuito come WebMethod.

GetCompanyList ha 2 di questi e deve anche essere static.

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

e, temo quello che sta succedendo è che si sta lasciando PageMethods indefinito lato client se non trova alcun metodi che hanno tutti e 3.

+0

Hai sicuramente ragione sul fatto che il metodo sia 'statico', ma non sono sicuro che si lamenterebbe del fatto che il proxy JavaScript sia' indefinito' se non ci fossero metodi di pagina validi. –

+0

@KarlAnderson: cerco di confermarlo ora. –

+0

Sì, questo sembra essere il problema. Ho trovato dove è stato cambiato da statico a non statico qualche tempo fa quando abbiamo refactored parte del codice. Anche se non ho ancora una versione statica funzionante, ora ho un errore diverso da quello che avevo. Grazie! –

3

È possibile richiamare ASP.NET AJAX Metodi pagina tramite jQuery, come questo:

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

Spiacente, ho incollato il codice sbagliato nel mio secondo frammento. Sì, 'EnablePageMethods' è impostato su true. Ho familiarità con '$ .ajax()' dal lavorare con MVC, ma sarebbe comunque bello far funzionare questo codice senza riscrivere. –

+1

Potrebbe esserci un problema con qualsiasi versione di Chrome che stai provando e il JavaScript generato da ASP.NET AJAX, jQuery ti fornirà un'esperienza di cross-browser molto migliore, ma capisco il tuo desiderio di farlo funzionare. Funziona in IE e/o Firefox? –

+0

Stesso risultato su IE. Sembra che potrebbe funzionare su una versione precedente di Firefox. –

1

forse si sta utilizzando Routing nelle vostre pagine. quindi deve essere impostato il percorso vero e proprio dopo PageMethods chiamata:

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

Una risposta da un'altra soluzione che ritengo debba essere rappresentato è se questo errore si verifica sul server, ma non a livello locale è quello di posizionare il file MyPage.aspx segnaposto vuoto e ora funziona anche sul server di produzione.