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

时间:2009-02-24 19:06:10

标签: asp.net jquery web-services asmx pagemethods

jQuery 1.3.2,ASP.NET 2.0。对PageMethod(WebMethod)进行AJAX调用会返回完整/整个页面,而不仅仅是响应。页面方法上的断点显示它永远不会被击中。我的方法有[WebMethod]属性,公共静态,返回字符串并且不接受参数。我甚至尝试在课程顶部添加[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/,我觉得我跟着这个去了T,但仍然没有运气。

我正在制作的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 个答案:

答案 0 :(得分:27)

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

听起来你可能会遗漏a web.config entry。特别是HttpModules部分。

答案 1 :(得分: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>

答案 2 :(得分:13)

我今天再次遇到这个问题的原因不同:我在

中拼错了“应用程序”
contentType: 'application/json'

获得了整页回复,而不是调用WebMethod。

答案 3 :(得分:6)

如果您已经尝试了所有这些并仍然从页面方法返回整个页面,您可能需要确保您没有使用友好的网址。 如果您正在使用它们,这个技巧可能会帮助您

在拨打电话之前在js脚本中添加以下行:

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

答案 4 :(得分: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 var。

答案 5 :(得分:0)

我见过的大多数ajax场景都应该调用Web服务或单独的脚本处理程序,而不是页面。这在.net 3-5中非常容易,在2-0中不那么容易。即使你弄清楚(如果)如何不加载整个页面,这里有理由不调用页面方法:

1)页面方法可能加载的内容少于整页加载,但仍远远超过简单的ajax调用所需的内容。 2)糟糕的责任分离。页面可能负责很好地放置东西,而不是你在ajax方法中使用的逻辑 3)也许你需要一些会话状态,但这应该仍然可用。

我目前正在更新我对这个主题的了解......我会在这个帖子中找到这个问题的一个很好的答案,或者我会在下周发布一个。这是我的方向

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

答案 6 :(得分:0)

差不多两个小时后,我尝试了一切,我终于解决了。@ Marvin Zumbado的评论帮助了我。我错过了我的网址.aspx。我知道这不是我作为程序员的最佳时刻!

答案 7 :(得分:0)

评论RouteConfig.cs中的以下行对我有用

 settings.AutoRedirectMode = RedirectMode.Permanent;