从JavaScript调用ASP.NET函数?

我在ASP.NET中编写一个网页。 我有一些JavaScript代码,并有一个点击事件的提交button。

是否有可能调用我在ASP中使用JavaScript的click事件创build的方法?

那么,如果你不想用Ajax或其他任何方式来完成,只想要一个正常的ASP.NET回发,那么下面是你如何做(不使用任何其他库):

这是一个有点棘手,虽然… 🙂

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

public partial class Default : System.Web.UI.Page, IPostBackEventHandler{} 

II。 这应该添加(使用TabTab )这个函数到你的代码文件中:

 public void RaisePostBackEvent(string eventArgument) { } 

III。 在JavaScript中的onclick事件中,编写下面的代码:

 var pageId = '<%= Page.ClientID %>'; __doPostBack(pageId, argumentString); 

这将调用代码文件中的'RaisePostBackEvent'方法,将'eventArgument'作为从JavaScript传递过来的'argumentString'。 现在,你可以打电话给你喜欢的任何其他事件。

PS:那就是'underscore-underscore-doPostBack'…而且,这个序列应该没有空间……不知怎的,WMD不允许我写下一个字符的下划线!

__doPostBack()方法运行良好。

另一个解决scheme(非常黑客)是简单地在标记中添加一个不可见的ASPbutton,并用JavaScript方法单击它。

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

从您的JavaScript中,使用其ClientID检索对button的引用,然后调用其上的.click()方法。

 var button = document.getElementById(/* button client id */); button.click(); 

微软AJAX库将完成这一点。 您也可以创build自己的解决scheme,包括使用AJAX调用自己的aspx(基本上)脚本文件来运行.NET函数。

我build议微软的AJAX库。 一旦安装和引用,您只需在页面加载或init中添加一行:

 Ajax.Utility.RegisterTypeForAjax(GetType(YOURPAGECLASSNAME)) 

然后你可以做这样的事情:

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

然后,你可以在你的页面上调用它:

 PageClassName.Get5(javascriptCallbackFunction); 

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

您可以使用.NET Ajax PageMethodsasynchronous执行此操作。 看到这里或这里 。

微软AJAX库将完成这一点。 您也可以创build自己的解决scheme,包括使用AJAX调用自己的aspx(基本上)脚本文件来运行.NET函数。

这是名为AjaxPro的图书馆,写了一个叫做Michael Schwarz的MVP。 这是图书馆不是由微软写的。

我广泛使用了AjaxPro,它是一个非常好的库,我会推荐简单的callback服务器。 它确实与Microsoft版本的Ajax无关,没有任何问题。 不过,我会注意到,微软已经成功制作了Ajax,我只会在真正需要的时候使用它。 通过将其放入更新面板,从微软获得一些非常复杂的function需要很多JavaScript。

静态的,强types的编程对我来说一直都很自然,所以起初我不得不为我的应用程序构build基于web的前端而学习JavaScript(更不用说HTML和CSS)。 我会做任何事情来解决这个问题,比如redirect到一个页面,只要执行OnLoad事件并对其执行操作,只要我可以编写纯C#代码即可。

然而,你会发现,如果你打算和网站合作,你必须有一个开放的思维,并开始思考更多的面向Web的(也就是说,不要试图在服务器上做客户端的事情,反之亦然) 。 我喜欢ASP.NET webforms并仍然使用它(还有MVC ),但是我会说,通过简单化和隐藏客户端和服务器的分离,它可以混淆新手,并且实际上最终使事情变得更加困难。

我的build议是学习一些基本的JavaScript(如何注册事件,检索DOM对象,操作CSS等),你会发现networking编程更愉快(更不用说更容易)。 很多人提到了不同的Ajax库,但是我没有看到任何实际的Ajax示例,所以在这里。 (如果您对Ajax不熟悉,则只需要发出asynchronousHTTP请求来刷新内容(或者在您的scheme中执行服务器端操作),而无需重新加载整个页面或执行完整的回发。

客户端:

 <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> 

而已。 虽然名称可能会误导,但结果也可以是纯文本或JSON,但不限于XML。 jQuery提供了一个更简单的接口来进行Ajax调用(简化其他JavaScript任务)。

该请求可以是HTTP-POST或HTTP-GET,并且不必是网页,但您可以发布到任何侦听HTTP请求的服务(如RESTful API)。 ASP.NET MVC 4 Web API使设置服务器端Web服务来轻松处理请求。 但是很多人不知道你也可以将API控制器添加到Web窗体项目中,并使用它们来处理像这样的Ajax调用。

服务器端:

 public class DataController : ApiController { public HttpResponseMessage<string[]> Get() { HttpResponseMessage<string[]> response = new HttpResponseMessage<string[]>( Repository.Get(true), new MediaTypeHeaderValue("application/json") ); return response; } } 

Global.asax中

然后,只要在你的Global.asax文件中注册HTTP路由,那么ASP.NET将知道如何引导请求。

 void Application_Start(object sender, EventArgs e) { RouteTable.Routes.MapHttpRoute("Service", "api/{controller}/{id}"); } 

使用AJAX和控制器,您可以随时回发到服务器以asynchronous执行任何服务器端操作。 这一举两得的function既提供了JavaScript的灵活性,又提供了C#/ ASP.NET的强大function,让访问您的网站的人们获得更好的整体体验。 在不牺牲任何东西的情况下,你可以得到两全其美的好处。

参考

  • Ajax ,
  • jQuery Ajax ,
  • Webforms中的控制器

我想博客文章如何使用Ajax(jQuery)在ASP.NET页面中获取和显示SQL Server数据库数据将帮助你。

JavaScript代码

 <script src="jquery-1.9.1.js"></script> <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> 

ASP.NET服务器端函数

 [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; } 

如果要触发服务器端事件处理程序(例如,Button的单击事件),则对于这两种scheme(即同步/asynchronous)来说都非常简单。

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

  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(); } } //]]> 
    1. 为您的控件编写服务器端事件处理程序

      protected void btnSayHello_Click(object sender,EventArgs e){Label1.Text =“Hello World …”; }

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

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

将上面的代码中的“btnSayHello”replace为您的控件的客户端ID。

通过这样做,如果您的控件位于更新面板中,则页面将不会刷新。 那太容易了

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

您可能需要为常用方法创buildWeb服务。
只需在要调用的函数上添加WebMethodAttribute即可。
拥有所有常见的东西的Web服务也使得系统更容易维护。

如果页面上没有生成__doPostBack函数,则需要插入一个控件来强制它:

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

我试图实现这一点,但它是行不通的。 该页面发回,但我的代码没有得到执行。 当我debugging页面时,RaisePostBackEvent永远不会被解雇。 有一件事我做了不同的是我在用户控件而不是一个aspx页面。

如果其他人和Merk一样,并且遇到麻烦,我有一个解决办法:

当你有一个用户控件时,看起来你还必须在父页面中创buildPostBackEventHandler。 然后通过直接调用用户控件的PostBackEventHandler来调用它。 见下文:

 public void RaisePostBackEvent(string _arg) { UserControlID.RaisePostBackEvent(_arg); } 

其中UserControlID是您在标记中嵌套时在父页面上给予用户控件的ID。

注意:您也可以直接调用属于该用户控件的方法(在这种情况下,您只需要父页面中的RaisePostBackEvent处理程序):

 public void RaisePostBackEvent(string _arg) { UserControlID.method1(); UserControlID.method2(); } 

关于:

 var button = document.getElementById(/* Button client id */); button.click(); 

它应该是这样的:

 var button = document.getElementById('<%=formID.ClientID%>'); 

formID是.aspx文件中的ASP.NET控件ID。

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

 ClientScript.GetPostBackEventReference(this, ""); 

跨浏览器的回复对我来说是一件轻而易举的事情:

__doPostBack()方法运行良好。

另一个解决scheme(非常黑客)是简单地在标记中添加一个不可见的ASPbutton,并用JavaScript方法单击它。

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

从您的JavaScript中,使用其ClientID检索对button的引用,然后调用其上的.Click()方法:

 var button = document.getElementByID(/* button client id */); button.Click(); 

大段引用

您可以使用PageMethods.Your C# method Name来访问C#方法或VB.NET方法到JavaScript中。

尝试这个:

 if(!ClientScript.IsStartupScriptRegistered("window")) { Page.ClientScript.RegisterStartupScript(this.GetType(), "window", "pop();", true); } 

或这个

 Response.Write("<script>alert('Hello World');</script>"); 

使用button的OnClientClick属性来调用JavaScript函数…

您也可以通过在JavaScript代码中添加以下代码来获得它:

 document.getElementById('<%=btnName.ClientID%>').click() 

我觉得这个很容易!

请试试这个:

 <%= Page.ClientScript.GetPostBackEventReference(ddlVoucherType, String.Empty) %>; 

ddlVoucherType是一个控件,选定的索引更改将调用…并且您可以将任何function放在此控件的选定索引更改上。

实现这个最简单和最好的方法是使用onmouseup() JavaScript事件而不是onclick()

这样,您将在点击后触发JavaScript,并且不会干扰ASP OnClick()事件。

我尝试这个,所以我可以运行一个Asp.Net方法,而使用jQuery。

  1. 在你的jQuery代码中做一个页面redirect

     window.location = "Page.aspx?key=1"; 
  2. 然后在页面加载中使用查询string

     protected void Page_Load(object sender, EventArgs e) { if (Request.QueryString["key"] != null) { string key= Request.QueryString["key"]; if (key=="1") { // Some code } } } 

所以不需要运行额外的代码