Вызов ASP.NET PageMethod/WebMethod с помощью jQuery - возвращает всю страницу

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

Я видел этот пост Jquery AJAX с ASP.NET WebMethod Returning Full 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 на свою страницу только для того, чтобы узнать, помог ли он, но не повезло.

Какие-либо предложения?

Ответ 1

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

Похоже, что вы можете потерять запись в web.config. В частности, раздел HttpModules.

Ответ 2

Мне не хватало одной строки из моего 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>

Ответ 3

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

contentType: 'application/json'

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

Ответ 4

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

Добавьте эту строку в свой js script, прежде чем совершать вызов:

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

Ответ 5

Бросьте это здесь как примечание. Я получал эту ошибку из-за длины моих строковых переменных в моей строке 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, поэтому я просто закодировал свою веб-страницу вместо использования loc var.

Ответ 6

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

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

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

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

Ответ 7

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

Ответ 8

Комментирование следующей строки в RouteConfig.cs работает для меня

 settings.AutoRedirectMode = RedirectMode.Permanent;