使用 jQuery 调用 ASP.NET PageMethod/WebMethod - 返回整个页面
Posted
技术标签:
【中文标题】使用 jQuery 调用 ASP.NET PageMethod/WebMethod - 返回整个页面【英文标题】:Call ASP.NET PageMethod/WebMethod with jQuery - returns whole page 【发布时间】:2010-10-09 15:31:39 【问题描述】:jQuery 1.3.2、ASP.NET 2.0。对 PageMethod (WebMethod) 进行 AJAX 调用会返回完整/整个页面,而不仅仅是响应。 page 方法上的断点表明它永远不会被命中。我的方法上有 [WebMethod] 属性,它 is 是公共静态的,返回字符串并且不接受任何参数。我什至尝试在我的班级顶部添加 [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 只是为了看看它是否有帮助,但没有运气。
有什么建议吗?
【问题讨论】:
【参考方案1】:您知道页面方法工作正常吗?如果您使用 ScriptManager,它们会起作用吗?
听起来您可能缺少a web.config entry。特别是 HttpModules 部分。
【讨论】:
当吉特!我知道这将是一件容易的事。我想我假设当我放入 ScriptManager 时,任何需要的配置都会由 VS 处理(这就是我添加它的原因,因为我知道你不需要它。谢谢! 研究这个问题一个多小时,web.config 和 ScriptModule httpModule 最终成为罪魁祸首。谢谢! 嗨,戴夫。根据@Surya,该链接似乎不再起作用了。【参考方案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>
【讨论】:
Adam Seabridge,无论你现在在哪里,我都爱你。 此解决方案引入了一个新错误:HTTP Error 500.22 - Internal Server Error【参考方案3】:我今天再次遇到这个问题,原因不同:我在
中拼错了“应用程序”contentType: 'application/json'
并且得到的是整页响应,而不是对 WebMethod 的调用。
【讨论】:
【参考方案4】:如果您已经尝试了所有这些并且仍然从您的页面方法返回整个页面,您可能需要确保您没有使用友好的 url。 如果你正在使用它们,这个技巧可能会对你有所帮助
在调用之前在你的 js 脚本中添加这一行:
PageMethods.set_path(PageMethods.get_path() + '.aspx');
【讨论】:
除此之外,因为使用了FriendlyURLs
我不得不添加这个***.com/a/35964882/1876355
这也是我需要的。我没有 web.config 模块。我没有按照@Pierre 的建议去做,而是删除了settings.AutoRedirectMode = RedirectMode.Permanent;
这一行【参考方案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】:在 RouteConfig.cs 中注释以下行对我有用
settings.AutoRedirectMode = RedirectMode.Permanent;
【讨论】:
【参考方案7】:我见过的大多数 ajax 场景确实应该调用 Web 服务或单独的脚本处理程序,而不是页面。这在 .net 3-5 中非常容易做到,而在 2-0 中则不那么容易。即使你弄清楚(如果)如何不加载整个页面,以下是不调用页面方法的原因:
1) 页面方法加载的内容可能比整个页面加载少,但仍然远远超过简单的 ajax 调用所需的内容。 2) 糟糕的职责分离。该页面可能负责很好地布置内容,而不是您在 ajax 方法中使用的逻辑。 3)也许您需要一些会话状态,但这应该仍然可用。
我目前正在更新我对这个主题的知识......我会在这个帖子中寻找这个问题的一个很好的答案,或者我会在下周发布一个。这是我前进的方向
1) 将 JSON 从服务器发送到客户端,并使用 javascript 更新您的页面。 - 多种框架使从 Web 服务器生成 JSON 变得容易。 2) JQuery 使 ajax 调用、json 处理和客户端格式化变得有趣,而不是痛苦。
【讨论】:
这就是“页面方法”。这只是编写返回 JSON 的 Web 服务的一种便捷方式。 1) 它仍然只是一个异步 javascript 调用。 PageMethod,也称为公共静态方法,在后面的代码中装饰有 WebMethod 属性,它只是一种语法糖,用于告诉 ASP.NET 使用来自代码的响应来响应针对该地址的 POST 请求。 (cont) 响应仍然只是 JSON,而且非常小。甚至没有视图状态。 2)你怎么知道我在页面方法中使用了什么逻辑?就我而言,它只是抓取实际上特定于该页面的数据,但在页面加载时不可用。 3)我不需要会话,但是 (cont) 异步调用适用于会话 - 您的请求仍附加到您的 cookie。其他 #1) 是的,这就是我使用 jQuery.ajax() 的原因;) 其他 #2) 确实,jQuery 很棒【参考方案8】:几乎两个小时后,在尝试了所有方法之后,我终于解决了它。@Marvin Zumbado 的评论帮助了我。我的网址中缺少 .aspx。我知道这不是我作为程序员的最佳时刻!
【讨论】:
以上是关于使用 jQuery 调用 ASP.NET PageMethod/WebMethod - 返回整个页面的主要内容,如果未能解决你的问题,请参考以下文章
asp.net ajax客户端框架如何调用Page Method