【问题标题】:Page_Load is been fired when WebMethod is called through javascript PageMethods通过 javascript PageMethods 调用 WebMethod 时会触发 Page_Load
【发布时间】:2014-06-27 17:05:33
【问题描述】:

我有一个 aspx 页面。我在其中添加了一个 ScriptManager,并设置了EnablePageMethods=true,并在服务器端创建了一个标记为 [WebMethod] 的静态方法。

我一直使用 WebMethods,以前从未见过此错误。

在 javascript 上,PageMethods 是可访问的。但是当我调用我的方法时,Page_Load 方法被触发,而不是 WebMethod。
我搜索并发现其他人也有这个问题。但没有答案....有什么想法吗?

HTML:

<body>
<form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>

JS:

PageMethods.Test()

C#:

[WebMethod]
public static void Test()
{

}

【问题讨论】:

  • 要触发对PageMethods.Test() 的JS 调用需要发生什么?点击按钮?
  • 可能......或任何其他方式。 PageMethods.Test() 被正确调用。
  • 是的,但是如果是通过按钮单击并且您没有阻止该单击导致对服务器的回调(通过event.preventDefault()),则会触发页面加载。
  • 确实如此,但事实并非如此。我尝试通过不同的方式调用它,它总是一样的。我创建了另一个解决方案,并粘贴了相同的代码,并且正确调用了 WebMethod。我正在处理的项目中一定有一些我遗漏的东西......也许是 web.config 上的一些东西......

标签: c# javascript asp.net ajax


【解决方案1】:

因此,在找到导致我的更新面板中的控件两次回调 post 的罪魁祸首之后,我发现这是因为调用了页面方法。

找到 LcSalazar 解决方案后,我禁用了友好 URL,一切正常。但我发现友好的 URL 更干净,所以我找到了一个解决方案。

在您的母版页上添加以下 .

   <script type="text/javascript">
        $(function () {
            try {
                if (PageMethods.get_path().indexOf('.aspx') == -1)
                    PageMethods.set_path(PageMethods.get_path() + '.aspx');
            } catch (e) {

            }
        })

    </script>

一旦页面方法路径包含 .aspx,page_load 就不会再次触发。

或者考虑使用 ASP.Net Web Api 。当涉及到可重用方法而不是在您的基本页面或您尝试使用它的每个页面中声明方法时,更好的做法也是如此。

【讨论】:

    【解决方案2】:

    我发现我的问题在于我使用的是友好的 URL。由于PageMethods 通过其地址引用服务器端页面,因此您遇到了问题。它已在 CodePlex 上讨论过:http://aspnetfriendlyurls.codeplex.com/workitem/3

    显然有解决方法,但我最终对通用处理程序 (.ashx) 进行了手动 ajax 调用。

    【讨论】:

    • 苦苦挣扎了一整天慢慢的定位问题,终于找到了一个page方法开始调用。谷歌搜索了写问题并找到了您的解决方案。是罪魁祸首
    【解决方案3】:

    当您提交具有 runat 服务器的表单时,它会处理完整的 .net 生命周期。这会触发您的 .cs 类的 Page_Load。如果你想让它严格地触发 webmethod,我建议对你的 webmethod 使用 ajax 调用。

    【讨论】:

    • 我没有提交表单。我正在使用 PageMethods 来调用静态服务器端方法。它依赖于 ScriptManager,因此它已经使用了 ajax 请求。
    【解决方案4】:

    禁用友好网址。在 App_Start\RouteConfig.cs 中将其注释掉 路线.EnableFriendlyUrls(设置);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2019-04-24
      • 2014-11-02
      相关资源
      最近更新 更多