2009-02-24 39 views
32

jQuery 1.3.2, ASP.NET 2.0. Hacer una llamada AJAX a PageMethod (WebMethod) devuelve la página completa/completa en lugar de solo la respuesta. Un punto de corte en el método de la página muestra que nunca se golpea. Tengo el atributo [WebMethod] en mi método, y es public static, devuelve string y no acepta parámetros. Incluso traté de agregar [ScriptService] en la parte superior de mi clase para ver si me ayudó, pero no fue así.Llamar ASP.NET PageMethod/WebMethod con jQuery - devuelve toda la página

He visto este post Jquery AJAX with ASP.NET WebMethod Returning Entire Page que tenía mis mismos síntomas, pero sigo teniendo un problema. Leí http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/ y siento que estoy siguiendo esto a la T, pero todavía no tuve suerte.

La llamada jQuery que estoy haciendo es:

jQuery.ajax({ 
    type: 'POST', 
    contentType: 'application/json; charset=utf-8', 
    data: '{}', 
    dataType: 'json', 
    url: 'MyPage.aspx/SomePageMethod', 
    success: function(result){ 
     alert(result); 
    } 
}); 

Las cabeceras de petición/respuesta, según Firebug en FF3, son los siguientes

Response Headers 
Server ASP.NET Development Server/8.0.0.0 
Date Tue, 24 Feb 2009 18:58:27 GMT 
X-AspNet-Version 2.0.50727 
Cache-Control private 
Content-Type text/html; charset=utf-8 
Content-Length 108558 
Connection Close 

Request Headers 
Host localhost:2624 
User-Agent Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6 
Accept application/json, text/javascript, */* 
Accept-Language en-us,en;q=0.5 
Accept-Encoding gzip,deflate 
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 
Keep-Alive 300 
Connection keep-alive 
Content-Type application/json; charset=utf-8 
X-Requested-With XMLHttpRequest 
Referer http://localhost:2624/MyApp/MyPage.aspx 
Content-Length 2 
Cookie ASP.NET_SessionId=g1idhx55b5awyi55fvorj055; 

He añadido un ScriptManager a mi página solo para ver si ayudó, pero no hubo suerte allí.

¿Alguna sugerencia?

Respuesta

27

¿Sabe que los métodos de página funcionan correctamente? Si usa el ScriptManager, ¿funcionan?

Parece que puede estar perdido a web.config entry. Específicamente la sección HttpModules.

+0

Dangit! Sabía que iba a ser algo fácil. Supongo que asumí que cualquier configuración que se necesitaría habría sido manejada por VS cuando dejé caer un ScriptManager (que era la razón por la que lo agregué, porque sabía que no * lo necesitabas * ¡Gracias! – Matt

+1

He estado investigando esto problema durante una hora + y web.config y el ScriptModule httpModule terminó siendo el culpable. ¡Gracias! –

+2

Hola Dave. Per @Surya, ese enlace ya no parece funcionar. – Matt

0

La mayoría de los escenarios de Ajax que he visto realmente deberían llamar a un servicio web o a un manejador de scripts separado, no a una página. Eso es extremadamente fácil de hacer en .net 3-5, no tan fácil en 2-0. Incluso después de averiguar (si) cómo no cargar toda la página, aquí hay razones para no llamar a un método de página:

1) El método de página puede cargar menos cosas que una carga de página completa, pero aún mucho más que necesitas una simple llamada ajax. 2) Pésima separación de responsabilidades. Es probable que la página sea la responsable de colocar bien las cosas, no la lógica que estás utilizando en el método ajax.
3) Tal vez necesite algún estado de sesión, pero aún debería estar disponible.

Actualmente estoy actualizando mis conocimientos sobre este tema ... Buscaré una buena respuesta a esta pregunta en este hilo, o la publicaré la próxima semana. Aquí está la dirección hacia la que me dirijo

1) Envíe JSON desde el servidor al cliente y use javascript para actualizar su página. - Una variedad de marcos hacen que sea fácil producir JSON desde el servidor web.
2) JQuery hace que las llamadas ajax, el manejo json y el formateo del cliente sean divertidos, en lugar de ser doloroso.

+0

Eso es lo que es un "método de página". Es solo una manera conveniente de escribir un servicio web que devuelve JSON. –

+0

1) Sigue siendo solo una llamada javascript asíncrona. Un método de página, también conocido como método público estático decorado con un atributo WebMethod en el código que está detrás, es solo azúcar sintáctico para decirle a ASP.NET que responda a las solicitudes POST contra esa dirección con una respuesta del código. – Matt

+0

(cont) La respuesta sigue siendo solo JSON, y muy pequeña. Sin viewstate, incluso. 2) ¿Cómo sabes qué lógica estoy usando en el método de la página? En mi caso, es simplemente capturar datos que, de hecho, son específicos de esta página, pero no estaban disponibles cuando se cargó la página. 3) No necesité sesión, pero la llamada asincrónica – Matt

23

me faltaba una línea de mi web.config:

<system.web> 
    <httpModules> 
    <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> 
    </httpModules> 
</system.web> 
+9

Adam Seabridge, donde quiera que estés ahora, te amo. –

+0

Esta solución presenta un nuevo error: HTTP Error 500.22 - Error interno del servidor –

13

me encontré con este problema hoy de nuevo por una razón diferente: había escrito mal "aplicación" en

contentType: 'application/json' 

Y estaba recibiendo una respuesta de página completa en lugar de una llamada a WebMethod.

+0

error de aplicación para mí también. gracias por el consejo. –

1

Tirar esto aquí como una nota al margen.Estaba obteniendo ese error debido a la longitud de mis variables de cadena en mi cadena HTML y el sitio web que utilicé para llamar mi ajax se veía así.

loc = (loc.substr(loc.length - 1, 1) == "/") ? loc + "Default.aspx" : loc; 
     $.ajax({ 
      type: "POST", 
      url: loc + "/" + methodName, 
      data: "{" + args + "}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: onSuccess, 
      error: onFail 
     }); 

no era capaz de extraer el enlace .aspx correctamente, por lo que sólo codificada de manera no mi página web en lugar de utilizar la locomotora var.

3

Si ha intentado todo eso y todavía obtiene toda la página devuelta desde el método de su página, puede asegurarse de que no esté utilizando las URL amistosas. Si los está utilizando, este truco puede ayudarle a

añadir esta línea en su script js antes de realizar la llamada:

PageMethods.set_path(PageMethods.get_path() + '.aspx'); 
0

Después de casi dos horas, y después había intentado todo lo que finalmente se resolvió. El comentario de @Marvin Zumbado me ayudó. Me faltaba el .aspx de mi URL. ¡Sé que este no es mi mejor momento como programador!

Cuestiones relacionadas