我想知道是否有人能够指导我方向。 我有一个带有点击事件(运行一些服务器端代码)的asp.net按钮。 我想通过ajax和jquery调用此事件。 是否有任何方法可以做到这一点?如果是,请提供一些示例。
提前感谢。
这也是jQuery在ASP.Net开发人员中的优势所在。比如说您有一个ASP按钮:
当它渲染出来时,您可以查看页面源代码,它的id不会是btnAwesome,而是$ctr001_btnAwesome或类似的东西。这使得在JavaScript中寻找它非常麻烦。于是jQuery应运而生。
$(document).ready(function() { $("input[id$='btnAwesome']").click(function() { // 在此执行客户端按钮单击操作。 }); });
id$= 是在进行以btnAwesome结尾的id的正则匹配。
编辑:
您是否希望在客户端从按钮单击事件调用ajax呼叫?您想呼叫什么?关于使用jQuery调用ASP.Net代码后台方法进行ajax呼叫,有许多很好的文章。
大意是创建一个标有WebMethod属性的 静态 方法。然后,您可以通过使用$.ajax来调用它。
$.ajax({ type: "POST", url: "PageName.aspx/MethodName", data: "{}", contentType: "application/json; charset=utf-8", dataType: "json", success: function(msg) { // 在此执行一些有趣的操作。 } });
我从这里学到了我的WebMethod内容:http://encosia.com/2008/05/29/using-jquery-to-directly-call-aspnet-ajax-page-methods/
里面有许多非常好的ASP.Net/jQuery内容。请确保仔细阅读为什么您必须在.Net 3.5(或自3.0以来)中使用msg.d返回值的相关文章。
我喜欢Gromer的答案,但是它让我有一个问题:如果我在不同的控件中有多个“btnAwesome”该怎么办?
为满足这种可能性,我会采取以下步骤:
$(document).ready(function() {
$('#<%=myButton.ClientID %>').click(function() {
// Do client side button click stuff here.
});
});
在我看来,这不是一个正则表达式匹配,而是需要精确匹配文本内容。如果您正在引用特定按钮,则需要进行精确文本匹配。
但是,如果您想为每个btnAwesome执行相同的操作,请使用Gromer的答案。
ASP.NET Web Forms页面已经有一个处理PostBack的JavaScript方法,名为"__doPostBack"。
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
在您的代码文件中使用以下内容生成执行PostBack的JavaScript。使用此方法将确保使用控件的正确ClientID。protected string GetLoginPostBack()
{
return Page.ClientScript.GetPostBackEventReference(btnLogin, string.Empty);
}
接着在ASPX页面中添加一个JavaScript块。
<script language="javascript">
function btnLogin_Click() {
<%= GetLoginPostBack() %>;
}
</script>
最终的JavaScript会呈现为这样。
<script language="javascript">
function btnLogin_Click() {
__doPostBack('btnLogin','');
}
</script>
现在你可以使用JavaScript中的"btnLogin_Click()"来提交按钮点击到服务器。
在客户端处理按钮的点击事件时,使用ClientID属性获取按钮的id:
$(document).ready(function() {
$("#<%=myButton.ClientID %>,#<%=muSecondButton.ClientID%>").click(
function() {
$.get("/myPage.aspx",{id:$(this).attr('id')},function(data) {
// do something with the data
return false;
}
});
});
protected void Page_Load(object sender,EventArgs e) {
// check if it is an ajax request
if (Request.Headers["X-Requested-With"] == "XMLHttpRequest") {
if (Request.QueryString["id"]==myButton.ClientID) {
// call the click event handler of the myButton here
Response.End();
}
if (Request.QueryString["id"]==mySecondButton.ClientID) {
// call the click event handler of the mySecondButton here
Response.End();
}
}
}
我发现自己想要做这件事情,于是我查看了以上的答案并采用了它们的混合方法。虽然有点棘手,但是这就是我所做的:
我的按钮已经能够使用服务器端的提交。我希望让它继续工作,因此我保留了 "OnClick" 并添加了一个 "OnClientClick":
OnClientClick="if (!OnClick_Submit()) return false;"
如果有必要,这是完整的按钮元素:
<asp:Button UseSubmitBehavior="false" runat="server" Class="ms-ButtonHeightWidth jiveSiteSettingsSubmit" OnClientClick="if (!OnClick_Submit()) return false;" OnClick="BtnSave_Click" Text="<%$Resources:wss,multipages_okbutton_text%>" id="BtnOK" accesskey="<%$Resources:wss,okbutton_accesskey%>" Enabled="true"/>
如果我在运行时检查HTML按钮的onclick属性,实际上看起来是这样的:
if (!OnClick_Submit()) return false;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$PlaceHolderMain$ctl03$RptControls$BtnOK", "", true, "", "", false, true))
然后在我的Javascript中,我添加了OnClick_Submit方法。在我的情况下,我需要检查是否需要向用户显示对话框。如果我显示对话框,则返回false以停止事件处理。如果我不显示对话框,则返回true使事件继续处理并运行我的回发逻辑,就像之前一样。
function OnClick_Submit() {
var initiallyActive = initialState.socialized && initialState.activityEnabled;
var socialized = IsSocialized();
var enabled = ActivityStreamsEnabled();
var displayDialog;
// Omitted the setting of displayDialog for clarity
if (displayDialog) {
$("#myDialog").dialog('open');
return false;
}
else {
return true;
}
}
然后,在用户接受对话框时运行的我的Javascript代码中,根据用户与对话框的交互方式执行以下操作:
$("#myDialog").dialog('close');
__doPostBack('message', '');
上面的“消息”实际上根据我想要发送的消息而有所不同。
回到我的服务器端代码,我将OnLoad从以下内容更改为:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e)
if (IsPostBack)
{
return;
}
// OnLoad logic removed for clarity
}
致:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e)
if (IsPostBack)
{
switch (Request.Form["__EVENTTARGET"])
{
case "message1":
// We did a __doPostBack with the "message1" command provided
Page.Validate();
BtnSave_Click(this, new CommandEventArgs("message1", null));
break;
case "message2":
// We did a __doPostBack with the "message2" command provided
Page.Validate();
BtnSave_Click(this, new CommandEventArgs("message2", null));
break;
}
return;
}
// OnLoad logic removed for clarity
}
CommandEventArgs commandEventArgs = e as CommandEventArgs;
string message = (commandEventArgs == null) ? null : commandEventArgs.CommandName;
最后,我可以根据是否有消息以及该消息的值提供基于逻辑的操作。