84

有谁知道为什么 asp:CheckBox 的客户端 javascript 处理程序需要是 OnClick="" 属性而不是 OnClientClick="" 属性,就像 asp:Button 一样?

例如,这有效:

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

这不会(没有错误):

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

但这有效:

<asp:Button runat="server" OnClientClick="alert('Hi');" />

这不会(编译时错误):

<asp:Button runat="server" OnClick="alert('hi');" />

(我知道 Button.OnClick 的用途;我想知道为什么 CheckBox 不能以同样的方式工作......)

4

9 回答 9

108

这很奇怪。我检查了CheckBox 文档页面,其中显示

<asp:CheckBox id="CheckBox1" 
     AutoPostBack="True|False"
     Text="Label"
     TextAlign="Right|Left"
     Checked="True|False"
     OnCheckedChanged="OnCheckedChangedMethod"
     runat="server"/>

如您所见,没有定义 OnClick 或 OnClientClick 属性。

记住这一点,我认为这就是正在发生的事情。

当你这样做时,

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

ASP.NET 不会修改 OnClick 属性并在浏览器上呈现它。它将呈现为:

  <input type="checkbox" OnClick="alert(this.checked);" />

显然,浏览器可以理解“OnClick”并发出警报。

在这种情况下

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

同样,ASP.NET 不会更改 OnClientClick 属性并将其呈现为

<input type="checkbox" OnClientClick="alert(this.checked);" />

由于浏览器无法理解 OnClientClick 什么都不会发生。它也不会引发任何错误,因为它只是另一个属性。

您可以通过查看呈现的 HTML 来确认上述内容。

是的,这根本不直观。

于 2009-07-16T02:35:02.817 回答
9

因为它们是两种不同的控件...

你看,你的网络浏览器不知道服务器端编程。它只知道它自己的 DOM 和它使用的事件模型......以及渲染给它的对象的点击事件。您应该检查实际从 ASP.Net 发送到浏览器的最终标记,以查看您自己的差异。

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

呈现为

<input type="check" OnClick="alert(this.checked);" />

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

呈现为

<input type="check" OnClientClick="alert(this.checked);" />

现在,据我所知,没有任何浏览器支持其 DOM 中的“OnClientClick”事件......

如有疑问,请始终在将输出发送到浏览器时查看其来源……您可以看到整个调试信息世界。

于 2009-07-16T02:39:39.067 回答
8

你是对的,这是不一致的。发生的事情是 CheckBox 没有服务器端 OnClick 事件,因此您的标记会呈现给浏览器。 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx

而 Button 确实有一个 OnClick - 因此 ASP.NET 期望在您的 OnClick 标记中引用一个事件。

于 2009-07-16T02:34:12.163 回答
6

对于那些来这里寻找服务器端 OnClick处理程序的人来说OnCheckedChanged

于 2012-11-29T16:00:35.070 回答
1

我正在清理警告和消息,发现 VS 确实警告过它:验证(ASP.Net):属性“OnClick”不是元素“CheckBox”的有效属性。使用 html 输入控件指定客户端处理程序,然后您将不会获得额外的 span 标记和两个元素。

于 2010-10-03T20:56:55.770 回答
1

Asp.net CheckBox 不支持方法 OnClientClick。
如果您想向 asp:CheckBox 添加一些 javascript 事件,您必须在服务器代码中的“Pre_Render”或“Page_Load”事件上添加相关属性:

C#:

    private void Page_Load(object sender, EventArgs e)
    {
        SomeCheckBoxId.Attributes["onclick"] = "MyJavaScriptMethod(this);";
    }

注意:确保您没有在页眉中设置 AutoEventWireup="false"。

VB:

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SomeCheckBoxId.Attributes("onclick") = "MyJavaScriptMethod(this);"
    End Sub
于 2018-12-19T12:29:54.620 回答
0

您可以将功能分配给所有复选框,然后在其中要求确认。如果他们选择是,则允许更改复选框,如果否则保持不变。

在我的情况下,我还在具有 Autopostback="True" 属性的转发器(或网格)内使用 ASP .Net 复选框,因此在服务器端我需要比较提交的值与数据库中当前的值,以了解它们的确认值只有当它是“是”时才选择并更新数据库。

$(document).ready(function () {
    $('input[type=checkbox]').click(function(){                
        var areYouSure = confirm('Are you sure you want make this change?');
        if (areYouSure) {
            $(this).prop('checked', this.checked);
        } else {
            $(this).prop('checked', !this.checked);
        }
    });
}); 


<asp:CheckBox ID="chk" AutoPostBack="true" onCheckedChanged="chk_SelectedIndexChanged" runat="server" Checked='<%#Eval("FinancialAid") %>' />

protected void chk_SelectedIndexChanged(Object sender, EventArgs e)
{
    using (myDataContext db = new myDataDataContext())
    {
        CheckBox chk = (CheckBox)sender;
        RepeaterItem row = (RepeaterItem) chk.NamingContainer;            
        var studentID = ((Label) row.FindControl("lblID")).Text;
        var z = (from b in db.StudentApplicants
        where b.StudentID == studentID
        select b).FirstOrDefault();                
        if(chk != null && chk.Checked != z.FinancialAid){
            z.FinancialAid = chk.Checked;                
            z.ModifiedDate = DateTime.Now;
            db.SubmitChanges();
            BindGrid();
        }
        gvData.DataBind();
    }
}
于 2021-01-11T21:38:28.193 回答
0

你可以像这样做标签:

<asp:CheckBox runat="server" ID="ckRouteNow" Text="Send Now" OnClick="checkchanged(this)" />

被调用的 JavaScript 中的 .checked 属性将是正确的……复选框的当前状态:

  function checkchanged(obj) {
      alert(obj.checked)
  }
于 2018-02-14T21:28:45.803 回答
-2

一种解决方案是使用 JQuery:

$(document).ready(
    function () {
        $('#mycheckboxId').click(function () {
               // here the action or function to call
        });
    }
);
于 2015-01-19T16:17:44.393 回答