从JavaScript调用ASP.NET函数?

从JavaScript调用ASP.NET函数?,javascript,c#,asp.net,onclick,Javascript,C#,Asp.net,Onclick,我正在用ASP.NET写一个网页。我有一些JavaScript代码,还有一个带有点击事件的提交按钮 是否可以使用JavaScript的单击事件调用我在ASP中创建的方法?您可以使用.NET Ajax PageMethods异步执行此操作。请参阅或。将完成此操作。您还可以创建自己的解决方案,包括使用AJAX调用自己的aspx(基本上)脚本文件来运行.NET函数 我建议使用MicrosoftAjax库。安装并引用后,只需在页面加载或初始化中添加一行: Ajax.Utility.RegisterTyp

我正在用ASP.NET写一个网页。我有一些JavaScript代码,还有一个带有点击事件的提交按钮


是否可以使用JavaScript的单击事件调用我在ASP中创建的方法?

您可以使用.NET Ajax PageMethods异步执行此操作。请参阅或。

将完成此操作。您还可以创建自己的解决方案,包括使用AJAX调用自己的aspx(基本上)脚本文件来运行.NET函数

我建议使用MicrosoftAjax库。安装并引用后,只需在页面加载或初始化中添加一行:

Ajax.Utility.RegisterTypeForAjax(GetType(YOURPAGECLASSNAME))
然后你可以做如下事情:

<Ajax.AjaxMethod()> _
Public Function Get5() AS Integer
    Return 5
End Function

函数调用的最后一个参数必须是返回AJAX请求时将执行的javascript回调函数。

好吧,如果您不想使用AJAX或任何其他方式进行调用,而只想进行正常的ASP.NET回发,下面是您的操作方法(不使用任何其他库):

不过这有点棘手……:)

一,。在代码文件中(假设您使用的是C#和.NET 2.0或更高版本),向Page类添加以下接口,使其看起来像

public partial class Default : System.Web.UI.Page, IPostBackEventHandler{}
二,。这将(使用Tab选项卡)将此函数添加到代码文件中:

public void RaisePostBackEvent(string eventArgument) { }
iii.在JavaScript中的onclick事件中,编写以下代码:

var pageId = '<%=  Page.ClientID %>';
__doPostBack(pageId, argumentString);
var pageId='';
__doPostBack(pageId,argumentString);
这将调用代码文件中的“RaisePostBackEvent”方法,其中“eventArgument”作为从JavaScript传递的“argumentString”。现在,您可以调用您喜欢的任何其他事件


附言:那就是“下划线doPostBack”。。。而且,序列中应该没有空格。。。不知何故,大规模杀伤性武器不允许我在字符后面加下划线

您可能希望为常用方法创建web服务。
只需在要调用的函数上添加WebMethodAttribute即可。
拥有一个包含所有常用内容的web服务也使系统更易于维护。

使用
\uu doPostBack()
方法效果良好

另一个解决方案(非常粗糙)是简单地在标记中添加一个不可见的ASP按钮,然后用JavaScript方法单击它

<div style="display: none;">
   <asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" />
</div>
<div style="display: none;"> 
    <asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" /> 
</div> 
MicrosoftAjax库将实现这一点。您还可以创建自己的解决方案,包括使用AJAX调用自己的aspx(基本上)脚本文件来运行.NET函数

这是一个名为AjaxPro的库,由一个名为的MVP编写。此库不是由Microsoft编写的


我已经广泛使用了AjaxPro,它是一个非常好的库,我建议对服务器进行简单的回调。它在Microsoft版本的Ajax中运行良好,没有任何问题。然而,我要指出的是,微软制造Ajax是多么容易,我只会在真正必要的时候使用它。要完成从Microsoft获得的一些非常复杂的功能,只需将其放到更新面板中,就需要大量的JavaScript。

这条回复对我来说轻而易举,感谢跨浏览器:

__doPostBack()方法运行良好

另一个解决方案(非常粗糙)是简单地在标记中添加一个不可见的ASP按钮,然后用JavaScript方法单击它

<div style="display: none;">
   <asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" />
</div>
<div style="display: none;"> 
    <asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" /> 
</div> 
大宗报价


如果未在页面上生成_udopostback函数,则需要插入控件以强制执行以下操作:

<asp:Button ID="btnJavascript" runat="server" UseSubmitBehavior="false" />

如果您收到预期的对象错误,请将此行添加到页面加载

ClientScript.GetPostBackEventReference(this, "");

您可以使用
PageMethods.C#方法名称
将C#方法或VB.NET方法访问到JavaScript中。

如果您想触发服务器端事件处理程序,例如按钮的单击事件,这两种情况(即同步/异步)都非常容易

用于触发控件的事件处理程序: 如果您已经在页面上添加了ScriptManager,请跳过步骤1

  • 在页面客户端脚本部分添加以下内容

    //<![CDATA[
    var theForm = document.forms['form1'];
    if (!theForm) {
        theForm = document.form1;
    }
    function __doPostBack(eventTarget, eventArgument) {
        if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
            theForm.__EVENTTARGET.value = eventTarget;
            theForm.__EVENTARGUMENT.value = eventArgument;
            theForm.submit();
        }
    }
    //]]>
    
    //
    
  • 为控件编写服务器端事件处理程序

    受保护的无效btnSayHello_单击(对象发送方,事件参数e) { Label1.Text=“你好,世界……”; }

  • 添加一个客户端函数来调用服务器端事件处理程序

    函数SayHello(){ __doPostBack(“btnSayHello”); }

  • 用控件的客户端id替换上面代码中的“btnSayHello”

    这样,如果控件位于更新面板内,则页面将不会刷新。那太容易了


    还有一点要说的是:小心使用客户端id,因为它取决于使用ClientIDMode属性定义的id生成策略。

    静态、强类型编程对我来说总是很自然,所以一开始我拒绝学习JavaScript(更不用说HTML和CSS了)当我不得不为我的应用程序构建基于web的前端时。我会做任何事情来解决这个问题,比如重定向到一个页面,只是为了在OnLoad事件上执行和操作,只要我可以编写纯C#

    然而,你会发现,如果你要使用网站,你必须有一个开放的思想,开始考虑更多面向网络的东西(也就是说,不要试图在服务器上做客户端的事情,反之亦然)。我喜欢ASP.NET webforms,并且仍然使用它(以及),但我要说的是,通过使事情变得更简单并隐藏客户端和服务器的分离,它可能会让新手感到困惑,有时甚至会让事情变得更困难

    我的建议是学习一些基本的JavaScript(如何注册事件、检索DOM对象、操作CSS等),您会发现web编程更有趣(更不用说更容易)。很多人提到了不同的Ajax库,但我没有看到任何实际的Ajax示例,所以就这样说吧。(如果您不熟悉Ajax,那么只需发出一个异步HTTP请求来刷新内容(或者在您的场景中执行服务器端操作),而无需重新加载整个页面或进行完整的回发

    客户端://<![CDATA[ var theForm = document.forms['form1']; if (!theForm) { theForm = document.form1; } function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } } //]]>
    <script type="text/javascript">
    var xmlhttp = new XMLHttpRequest(); // Create object that will make the request
    xmlhttp.open("GET", "http://example.org/api/service", "true"); // configure object (method, URL, async)
    xmlhttp.send(); // Send request
    
    xmlhttp.onstatereadychange = function() { // Register a function to run when the state changes, if the request has finished and the stats code is 200 (OK). Write result to <p>
        if (xmlhttp.readyState == 4 && xmlhttp.statsCode == 200) {
              document.getElementById("resultText").innerHTML = xmlhttp.responseText;
        }
    };
    </script>
    
    public class DataController : ApiController
    {
        public HttpResponseMessage<string[]> Get()
        {
            HttpResponseMessage<string[]> response = new HttpResponseMessage<string[]>(
                Repository.Get(true),
                new MediaTypeHeaderValue("application/json")
            );
    
            return response;
        }
    }
    
    void Application_Start(object sender, EventArgs e)
    {
        RouteTable.Routes.MapHttpRoute("Service", "api/{controller}/{id}");
    }
    
    if(!ClientScript.IsStartupScriptRegistered("window"))
    {
        Page.ClientScript.RegisterStartupScript(this.GetType(), "window", "pop();", true);
    }
    
    Response.Write("<script>alert('Hello World');</script>");
    
    document.getElementById('<%=btnName.ClientID%>').click()
    
    public void RaisePostBackEvent(string _arg)
    {
        UserControlID.RaisePostBackEvent(_arg);
    }
    
    public void RaisePostBackEvent(string _arg)
    {
        UserControlID.method1();
        UserControlID.method2();
    }
    
    <script src="http://code.jquery.com/jquery-3.3.1.js" />
    <script language="javascript" type="text/javascript">
    
        function GetCompanies() {
            $("#UpdatePanel").html("<div style='text-align:center; background-color:yellow; border:1px solid red; padding:3px; width:200px'>Please Wait...</div>");
            $.ajax({
                type: "POST",
                url: "Default.aspx/GetCompanies",
                data: "{}",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                success: OnSuccess,
                error: OnError
            });
        }
    
        function OnSuccess(data) {
            var TableContent = "<table border='0'>" +
                                    "<tr>" +
                                        "<td>Rank</td>" +
                                        "<td>Company Name</td>" +
                                        "<td>Revenue</td>" +
                                        "<td>Industry</td>" +
                                    "</tr>";
            for (var i = 0; i < data.d.length; i++) {
                TableContent += "<tr>" +
                                        "<td>"+ data.d[i].Rank +"</td>" +
                                        "<td>"+data.d[i].CompanyName+"</td>" +
                                        "<td>"+data.d[i].Revenue+"</td>" +
                                        "<td>"+data.d[i].Industry+"</td>" +
                                    "</tr>";
            }
            TableContent += "</table>";
    
            $("#UpdatePanel").html(TableContent);
        }
    
        function OnError(data) {
    
        }
    </script>
    
    [WebMethod]
    [ScriptMethod(ResponseFormat= ResponseFormat.Json)]
    public static List<TopCompany> GetCompanies()
    {
        System.Threading.Thread.Sleep(5000);
        List<TopCompany> allCompany = new List<TopCompany>();
        using (MyDatabaseEntities dc = new MyDatabaseEntities())
        {
            allCompany = dc.TopCompanies.ToList();
        }
        return allCompany;
    }
    
    var button = document.getElementById(/* Button client id */);
    
    button.click();
    
    var button = document.getElementById('<%=formID.ClientID%>');
    
    <%= Page.ClientScript.GetPostBackEventReference(ddlVoucherType, String.Empty) %>;
    
    window.location = "Page.aspx?key=1";
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.QueryString["key"] != null)
        {
            string key= Request.QueryString["key"];
            if (key=="1")
            {
                // Some code
            }
        }
    }