OnClick与OnClientClick为asp:CheckBox?

有没有人知道为什么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不能以同样的方式工作…)

这很奇怪。 我检查了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来确认上面的内容。

是的,这根本不直观。

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

而Button确实有一个OnClick – 所以ASP.NET需要在您的OnClick标记中引用一个事件。

因为他们是两种不同的控制…

你看,你的网页浏览器不知道服务器端编程。 它只知道它自己的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”事件。

如果有疑问,请在发送给浏览器时始终查看输出的源代码…您可以看到一个完整的debugging信息世界。

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

我正在清理警告和消息,并看到VS会警告:validation(ASP.Net):属性“OnClick”不是元素“CheckBox”的有效属性。 使用htmlinput控件来指定一个客户端处理程序,然后你将不会得到额外的跨度标签和两个元素。

一个解决scheme是使用JQuery:

 $(document).ready( function () { $('#mycheckboxId').click(function () { // here the action or function to call }); } );