在JavaScript的点击事件中,是否可以调用我在ASP中创建的方法?
如果您不想使用Ajax或任何其他方式来完成操作,只是希望进行普通的ASP.NET回传,那么以下是如何实现它(不使用任何其他库):
尽管有点棘手... :)
i. 在您的代码文件中(假设您正在使用C#和.NET 2.0或更高版本),请将以下接口添加到您的Page类中,使其看起来像:
public partial class Default : System.Web.UI.Page, IPostBackEventHandler{}
ii. 这应该通过使用 Tab-Tab 将此函数添加到您的代码文件中:
public void RaisePostBackEvent(string eventArgument) { }
iii. 在JavaScript中的onclick事件中编写以下代码:
var pageId = '<%= Page.ClientID %>';
__doPostBack(pageId, argumentString);
onkeyup
事件使其工作。出现了“JavaScript运行时错误:'__doPostBack'未定义”。我正在使用C#和ASP.NET2.0。 - Andrew T.__doPostBack()
方法运作良好。
另一个解决方案(非常巧妙的)是在您的标记中添加一个不可见的ASP按钮,并用JavaScript方法单击它。
<div style="display: none;">
<asp:Button runat="server" ... OnClick="ButtonClickHandlerMethod" />
</div>
使用ClientID检索按钮的引用并在JavaScript中调用.click()方法。
var button = document.getElementById(/* button client id */);
button.click();
Microsoft AJAX库可以实现这一目标。你也可以创建自己的解决方案,使用AJAX调用你自己的aspx文件(基本上)运行.NET函数。
我建议使用Microsoft AJAX库。一旦安装和引用,只需在页面加载或初始化中添加一行:
Ajax.Utility.RegisterTypeForAjax(GetType(YOURPAGECLASSNAME))
然后你可以做这样的事情:
<Ajax.AjaxMethod()> _
Public Function Get5() AS Integer
Return 5
End Function
然后,在您的页面上可以这样调用:
PageClassName.Get5(javascriptCallbackFunction);
你的函数调用的最后一个参数必须是JavaScript回调函数,当AJAX请求返回时将执行该函数。
JavaScript代码
<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>
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;
}
对我而言,静态、强类型编程一直感觉很自然,因此当我不得不为我的应用程序构建基于Web的前端时,一开始我抗拒学习JavaScript(更不用说HTML和CSS)。我会尽力绕过这个问题,比如重定向到一个页面只是为了在OnLoad事件上执行操作,只要我能编写纯C#代码。
但是你会发现,如果你要处理网站,你必须开放思路,开始更多地考虑Web方向(也就是说,不要试图在服务器端或客户端做与本身职责无关的事情)。我喜欢ASP.NET WebForms并仍在使用它(以及MVC),但我会说,试图简化事物并隐藏客户端和服务器之间的分离可能会使新手困惑,并在某些时候实际上使事情变得更加困难。
我的建议是学习一些基本的JavaScript知识(如如何注册事件、检索DOM对象、操作CSS等),这样你会发现网页编程更加有趣(更不用说更容易了)。很多人提到了不同的Ajax库,但我没有看到任何实际的Ajax示例,所以接下来就是一个示例。如果您不熟悉Ajax,它只是通过异步HTTP请求刷新内容(或在您的场景中执行服务器端操作)而无需重新加载整个页面或进行完整的后台提交。客户端:
<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;
}
}
Global.asax
然后只需在Global.asax文件中注册HTTP路由,这样ASP.NET就知道如何指导请求了。
void Application_Start(object sender, EventArgs e)
{
RouteTable.Routes.MapHttpRoute("Service", "api/{controller}/{id}");
}
如果您想触发服务器端的事件处理程序,例如按钮单击事件,对于同步/异步两种情况都很容易。
触发控件的事件处理程序:
如果您已经在页面上添加了ScriptManager,请跳过步骤1。
Add the following in your page client script section
//<![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();
}
}
//]]>
Write you server side event handler for your control
protected void btnSayHello_Click(object sender, EventArgs e) { Label1.Text = "Hello World..."; }
Add a client function to call the server side event handler
function SayHello() { __doPostBack("btnSayHello", ""); }
public void RaisePostBackEvent(string _arg)
{
UserControlID.RaisePostBackEvent(_arg);
}
其中 UserControlID 是您在父页面中嵌套标记时为用户控件指定的 ID。
注意:您还可以直接调用属于该用户控件的方法(在这种情况下,您只需要在父页面中使用 RaisePostBackEvent 处理程序):
public void RaisePostBackEvent(string _arg)
{
UserControlID.method1();
UserControlID.method2();
}
<asp:Button ID="btnJavascript" runat="server" UseSubmitBehavior="false" />