2009-02-24 5 views
32

jQuery 1.3.2, ASP.NET 2.0. Выполнение вызова AJAX на PageMethod (WebMethod) возвращает полную/целую страницу, а не только ответ. Точка останова на странице показывает, что она никогда не попадает. У меня есть атрибут [WebMethod] в моем методе, и он является public static, возвращает строку и не принимает никаких параметров. Я даже попытался добавить [ScriptService] в начало моего класса, чтобы узнать, помогло ли это, но это не так.Вызов ASP.NET PageMethod/WebMethod с jQuery - возвращает всю страницу

Я видел это сообщение Jquery AJAX with ASP.NET WebMethod Returning Entire Page, у которого были такие же симптомы, но у меня все еще есть проблема. Я читал http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/, и мне кажется, что я следую за этим Т, но мне все равно не повезло.

Вызов JQuery Я делаю это:

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

заголовки запроса/ответа, в соответствии с Firebug в FF3, являются

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; 

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

Любые предложения?

ответ

27

Знаете ли вы, что Методы страницы работают правильно? Если вы используете ScriptManager, они работают?

Звучит так, как будто вам не хватает a web.config entry. В частности, раздел HttpModules.

+0

Dangit! Я знал, что это будет что-то легкое. Я предполагаю, что я предположил, что любые конфигурации, которые понадобятся, были бы обработаны VS, когда я упал в ScriptManager (именно поэтому я добавил его, потому что я знал, что вам это не нужно * это. Спасибо! – Matt

+1

Изучение этого проблема в течение часа + и web.config, а ScriptModule httpModule оказался виновником. Спасибо! –

+2

Hi Dave. Per @Surya, эта ссылка больше не работает. – Matt

0

Большинство сценариев ajax, которые я видел, действительно должны вызывать веб-службу или отдельный обработчик сценария, а не страницу. Это очень легко сделать в .net 3-5, не так просто в 2-0. Даже после того, как вы выясните (если), как не загружать всю страницу, вот причины, по которым нельзя вызвать метод страницы:

1) Метод страницы может загружать меньше материала, чем полная загрузка страницы, но все же гораздо больше, чем вам нужен простой аякс-вызов. 2) Отвратительное разделение обязанностей. Вероятно, страница ответственна за красивую прокладку, а не за логику, которую вы используете в методе ajax.
3) Возможно, вам нужно какое-то состояние сеанса, но это все равно должно быть доступно.

Я в настоящее время обновляю свои знания по этому предмету ... Я буду искать хороший ответ на этот вопрос в этой теме, или я отправлю на следующей неделе. Вот направление, которым я возглавляю

1) Отправьте JSON с сервера на клиент и используйте javascript для обновления вашей страницы. - различные структуры позволяют легко создавать JSON с веб-сервера.
2) JQuery делает ajax-вызовы, обработку json и форматирование для клиентов забавным, а не болезненным.

+0

Вот что такое «метод страницы». удобный способ написания веб-сервиса, который возвращает JSON. –

+0

1) Это все еще только асинхронный вызов javascript. PageMethod, также известный как публичный статический метод, украшенный атрибутом WebMethod в вашем коде позади, является просто синтаксическим сахаром, чтобы сообщить ASP.NET отвечать на запросы POST на этот адрес с ответом от кода. – Matt

+0

(продолжение) Ответ по-прежнему остается только JSON и очень мал. Никакого просмотра, даже. 2) Откуда вы знаете, какую логику я использую в методе страницы? В моем случае это просто захват данных, которые на самом деле специфичны для этой страницы, но недоступны при загрузке страницы. 3) Мне не нужен сеанс, но вызов async – Matt

23

мне не хватает одной строки из моего 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, где бы вы ни были, я люблю тебя. –

+0

Это решение представляет новую ошибку: Ошибка HTTP 500.22 - Ошибка внутреннего сервера –

13

Я столкнулся с этой проблемой сегодня снова по другой причине: я неправильно «приложение» в

contentType: 'application/json' 

И получал полностраничный ответ вместо вызова WebMethod.

+0

. Спасибо за совет. –

1

Выбрасывание этого здесь как примечание стороны.Я получал эту ошибку из-за длины моих строковых переменных в моей строке HTML, и веб-сайт, который я использовал для вызова моего ajax, выглядел так.

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

Он не был способен извлекать ссылку .aspx правильно, так что я просто жёстко моего сайта вместо того, чтобы использовать локацию вар.

3

Если вы попробовали все это и все еще получили всю страницу, возвращенную с вашего pagemethod, вы можете убедиться, что не используете дружественные URL-адреса. Если вы их используете, этот трюк может помочь вам

Добавьте эту строку в ваш JS скрипт, прежде чем сделать звонок:

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

Спустя почти два часа, и после того, как попробовал все, что я наконец-то решил. Комментарий @Marvin Zumbado помог мне. Мне не хватало .aspx от моего url.I знаю, что это не мой лучший момент в качестве программиста!