通过javascript PageMethods调用WebMethod时会触发Page_Load

时间:2014-05-09 20:26:31

标签: c# javascript asp.net ajax

我有一个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()
{

}

4 个答案:

答案 0 :(得分:2)

因此,在我的更新面板中创建控件的原因是两次调用post后,我发现这是因为调用了一个页面方法。

找到LcSalazar解决方案后,我确实禁用了友情网址,一切正常。但我发现友好的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。当涉及到可重用的方法而不是在您的基页或您尝试使用它的每个页面中声明方法时,也可以更好地练习。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

禁用友好网址。在App_Start \ RouteConfig.cs中注释掉它 routes.EnableFriendlyUrls(设置);