使用jQuery调用ASP.NET PageMethod/WebMethod - 返回整个页面

37
jQuery 1.3.2,ASP.NET 2.0。调用PageMethod(WebMethod)进行AJAX调用时返回整个页面而不是响应。在页面方法上设置断点显示它从未被触发。我在我的方法上有[WebMethod]属性,并且它是public static,返回字符串并且不接受任何参数。我甚至尝试在我的类顶部添加[ScriptService]以查看它是否有所帮助,但没有。

我看到了这篇文章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);
    }
});

根据FF3中的Firebug,请求/响应头如下所示:
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个回答

28

您知道页面方法是否正常工作吗?如果您使用ScriptManager,它们是否有效?

听起来您可能缺少web.config条目。具体来说是HttpModules部分。


该死!我知道这肯定是个简单的问题。我想当我加入ScriptManager时,任何需要的配置都会被VS处理掉(这也是我添加它的原因,因为我知道你不需要它)。谢谢! - Matt
1
已经研究了一个多小时的问题,web.config和ScriptModule httpModule最终被证明是罪魁祸首。谢谢! - John Lewin
4
嗨,戴夫。根据@Surya的说法,那个链接似乎不再有效。 - Matt

24

我的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,无论你现在在哪里,我爱你。 - Cᴏʀʏ
1
此解决方案引入了一个新的错误:HTTP 错误 500.22 - 内部服务器错误。 - Charles Okwuagwu

13

我今天再次遇到了这个问题,但原因不同:我在代码中将"application"的拼写搞错了。

contentType: 'application/json'

我收到了完整页面的响应而不是对WebMethod的调用。


7
如果您已经尝试了所有方法,但仍然从pagemethod返回整个页面,请确保您没有使用友好的URL。如果您正在使用友好的URL,则可以尝试以下技巧:
在调用之前,在您的JS脚本中添加以下行:
PageMethods.set_path(PageMethods.get_path() + '.aspx');

除此之外,由于使用了“友好的URL”,我不得不添加这个 https://stackoverflow.com/a/35964882/1876355 - Pierre
这正是我所需要的。我没有web.config模块。 我没有按照@Pierre的建议去做,而是直接删除了settings.AutoRedirectMode = RedirectMode.Permanent;这一行。 - DrCJones

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链接,因此我硬编码了我的网页,而不是使用loc变量。


1
在RouteConfig.cs中注释掉以下行对我有用。
 settings.AutoRedirectMode = RedirectMode.Permanent;

0

我看到的大多数ajax场景都应该调用Web服务或单独的脚本处理程序,而不是页面。在.NET 3-5中非常容易实现,但在2-0中并不容易。即使你弄清楚了如何不加载整个页面,以下是不调用页面方法的原因:

1)页面方法可能加载的内容比完整页面加载少,但仍然比简单的ajax调用所需的内容要多得多。 2)职责分离很差。页面可能负责将内容布局得好看,而不是您在ajax方法中使用的逻辑。
3)也许您需要一些会话状态,但那仍然应该可用。

我目前正在更新我的知识...我将在这个主题中寻找一个好答案,或者下周我会发布一个答案。以下是我正在探索的方向

1)从服务器向客户端发送JSON,并使用JavaScript更新您的页面。 - 各种框架使从Web服务器生成JSON变得容易。
2)JQuery使ajax调用、json处理和客户端格式化变得有趣,而不是痛苦。


这就是所谓的“页面方法”。它只是编写返回JSON的Web服务的一种方便方式。 - Dave Ward
这仅仅是一个异步JavaScript调用而已。PageMethod,也被称为在您的代码后面使用WebMethod属性装饰的公共静态方法,只是一种语法糖,用于告诉ASP.NET通过来自代码的响应来回应针对该地址的POST请求。 - Matt
  1. 你怎么知道我在页面方法中使用的逻辑是什么?在我的情况下,它只是获取实际上特定于此页面的数据,但在页面加载时不可用。
  2. 我不需要会话,但是
- Matt
(cont) 使用异步调用与会话一起工作正常 - 您的请求仍然附加在您的 cookie 上。其他 #1)是的,这就是为什么我使用 jQuery.ajax() ;) 其他 #2)确实,jQuery 真是太棒了。 - Matt

0

经过将近两个小时的尝试,我终于解决了问题。@Marvin Zumbado的评论帮了我很大的忙。我错过了我的URL中的.aspx后缀,这不是我作为程序员最好的时刻!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接