Вызов ASP.NET PageMethod / WebMethod с помощью jQuery - возвращает всю страницу - PullRequest
35 голосов
/ 24 февраля 2009

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

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

Есть предложения?

Ответы [ 8 ]

27 голосов
/ 24 февраля 2009

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

Звучит так, как будто вы пропускаете запись web.config . В частности, раздел HttpModules.

23 голосов
/ 15 апреля 2009

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

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

contentType: 'application/json'

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

6 голосов
/ 08 августа 2014

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

Добавьте эту строку в свой js-скрипт перед тем, как сделать вызов:

PageMethods.set_path(PageMethods.get_path() + '.aspx');
1 голос
/ 15 февраля 2011

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

0 голосов
/ 10 апреля 2019

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

 settings.AutoRedirectMode = RedirectMode.Permanent;
0 голосов
/ 29 ноября 2017

Спустя почти два часа и после того, как я попробовал все, я наконец решил это. Комментарий Марвина Зумбадо помог мне. Я пропустил .aspx из своего URL. Я знаю, что это не лучший момент для меня как программиста!

0 голосов
/ 25 февраля 2009

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

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

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

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

...