【问题标题】:How to call code behind method from a javascript function?如何从javascript函数调用方法背后的代码?
【发布时间】:2013-09-01 21:00:28
【问题描述】:

我在 aspx 页面中有一个用于 HTML img 点击事件的 javascript 函数。还有一个服务器方法在它的代码后面的页面中。现在我想只在用户单击 HTML img 时从 javascript 函数中调用服务器方法而不使用任何参数。

方法背后的 C# 代码:

[WebMethod]
public void PopUpClick(object sender, EventArgs e)
{
    //Something;
}

JavaScript方法:

 $(document).ready(function () {

    $('.clickme').click(function () {
        PageMethods.PopUpClick();
    });

});

我还在母版页中添加了:<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" EnablePageMethods="true" />

它不工作。当我在 Chrome 上调试这个 Javascript 函数时 我看到一个错误:Uncaught Reference Error:PageMethods is not defined。

【问题讨论】:

标签: c# javascript asp.net .net scriptmanager


【解决方案1】:

.aspx

     <div>
        <p>Say bye-bey to Postbacks.</p>

        <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true"></asp:ScriptManager>
        <asp:TextBox ID="txtname" runat="server"></asp:TextBox>
        <br />
        <asp:TextBox ID="txtaddress" runat="server"></asp:TextBox>
        <br />
        <asp:Button ID="btnCreateAccount" runat="server" Text="Signup" OnClientClick="HandleIT(); return false;" />
    </div>

JavaScript

<script type="text/javascript">
        function HandleIT() {
            var name = document.getElementById('<%=txtname.ClientID %>').value;
            var address = document.getElementById('<%=txtaddress.ClientID %>').value;
            PageMethods.ProcessIT(name, address, onSucess, onError); 
            function onSucess(result) {
                alert(result);
            }
            function onError(result) {
                alert('Something wrong.');
            }
        }
    </script>

C#

 [WebMethod]
    public static string ProcessIT(string name, string address)
    {
        string result = "Welcome Mr. " + name + ". Your address is '" + address + "'.";
        return result;
    }

【讨论】:

  • 非常感谢!非常有帮助,即使在两年后,几乎到今天!
【解决方案2】:

定义的 WebMethods 必须是“静态的”。

以下对 WebMethod“GetAllRegions”的 ajax 调用可以正常工作,前提是 WebMethod 被定义为静态!!

$.ajax({
  type: "POST",
  url: 'GenerateEAInHtml.aspx/GetAllRegions',
  data: "{}",
  contentType: "application/json; charset=utf-8",
  dataType: "json",
});

WebMethod 是这样定义的:

[WebMethod]
public static List<Region> GetAllRegions()
{
  /* Your Code goes here */
  return regions;
}

您可能还想使用此 Ajax Post 来通过传递 data 参数将 JSON 数据传递给 WebMethod!这应该会有所帮助。

【讨论】:

    【解决方案3】:

    假设您的页面名称是 abc.aspx,xyz 是您必须调用的函数名称。 脚本:

    函数发送数据(偏移量){ $.ajax({ 类型:“发布”, 网址:“abc.aspx/xyz”, contentType: "应用程序/json; charset=utf-8", 数据类型:“json” }); }

    服务器端:添加Imports System.Web.Script.Serialization

    WebMethod(enableSession:=True) _ 公共共享函数 xyz() 作为字符串 你的代码在这里 结束功能

    在 web.config 中添加模块 -> system.webServer

    ->system.webServer> ->模块> -> 添加名称="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> ->/模块> ->/system.webServer>

    【讨论】:

      【解决方案4】:

      后端 C# 代码与前端 JavaScript 代码是分开的。 JS 运行在客户端,C# 运行在服务器端。为了让前端代码触发后端函数,您需要您的函数执行表单回发或使用 Ajax(或等效的)来调用该页面函数。

      【讨论】:

        【解决方案5】:

        试试这个

        [WebMethod]
        
          public static void PopUpClick(object sender, EventArgs e)
            {
                //Something;
            }
        

        【讨论】:

        • 试试什么?您刚刚发布了他们已经拥有的部分 OP 代码
        • 不,不一样。密切关注。 ;)
        • 好的,你已经成功了static,这有什么帮助?
        • 这可能是错误“未捕获的引用错误:PageMethods 未定义”的可能解决方案。
        • 我不能使用静态,因为页面和方法中的一些变量不是静态的。
        【解决方案6】:

        使用ImageButton。处理程序不需要标记为[WebMethod]

        <asp:ImageButton runat="server" ID="btnPopUp" ImageUrl="img.png" OnClick="PopUpClick" />
        

        为什么要直接使用img?

        【讨论】:

        • 因为我必须在代码中创建这个图像到这样的方法中。 return "....";
        【解决方案7】:

        顶部有一行表示取消注释以通过 JavaScript 调用它。

        取消注释。

        然后像这样在您的方法中添加[ScriptMethod]

        [WebMethod]
        [ScriptMethod]
        public void PopUpClick(object sender, EventArgs e)
        {
            // Something;
        }
        

        然后您应该能够从 PageMethods 对象调用它。

        但是我刚刚进行了一些研究,看来您可能需要将使用 PageMethods 的代码放在末尾/在 ScriptManager 之后,因为您可能在尝试使用 PageMethods 之前在 JavaScript 中声明。或者,如果您使用的是 jQuery,那么您可以在 ready 事件中执行此操作,这样您就知道页面和所有内容都已加载。我认为这可能是根本原因。

        【讨论】:

          【解决方案8】:

          Web 方法必须声明为静态和公共的。

          虽然您不能直接访问该页面,但您可以将所需内容从客户端代码中的调用传递到 Web 方法,或者将所需内容存储在会话或类似的状态存储机制中,可从你的静态网络方法。

          这可能需要重新考虑你想用它做什么。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-15
            • 1970-01-01
            相关资源
            最近更新 更多