OnClick和OnClientClick for asp:CheckBox?

Sto*_*bor 83 javascript asp.net checkbox onclick onclientclick

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

例如,这有效:

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

这不(没有错误):

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

但这有效:

<asp:Button runat="server" OnClientClick="alert('Hi');" />
Run Code Online (Sandbox Code Playgroud)

这不会(编译时错误):

<asp:Button runat="server" OnClick="alert('hi');" />
Run Code Online (Sandbox Code Playgroud)

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

Sol*_*ogi 104

这很奇怪.我检查了复选框文档页面读取

<asp:CheckBox id="CheckBox1" 
     AutoPostBack="True|False"
     Text="Label"
     TextAlign="Right|Left"
     Checked="True|False"
     OnCheckedChanged="OnCheckedChangedMethod"
     runat="server"/>
Run Code Online (Sandbox Code Playgroud)

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

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

当你这样做,

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

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

  <input type="checkbox" OnClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

显然,浏览器可以理解"OnClick"并发出警报.

在这种情况下

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

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

<input type="checkbox" OnClientClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

由于浏览器无法理解OnClientClick,因此不会发生任何事情.它也不会引发任何错误,因为它只是另一个属性.

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

是的,这根本不直观.

  • 该文档实际上来自.Net 1.1.据我所知,ASP .Net没有针对CheckBox的OnClick服务器端事件,因此当您编写OnClick或OnClientClick时,因为它不知道它,它会呈现您所写的内容,因为它是默认行为(如果我没错的话) (2认同)

dat*_*cop 9

因为它们是两种不同的控制方式......

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

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

呈现给

<input type="check" OnClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

呈现给

<input type="check" OnClientClick="alert(this.checked);" />
Run Code Online (Sandbox Code Playgroud)

现在,就像我记得的那样,在任何地方都没有任何支持DOM的"OnClientClick"事件的浏览器......

如有疑问,请始终在输出到浏览器时查看输出源...您可以看到整个调试信息世界.


rus*_*sau 8

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

而Button确实有一个OnClick - 所以ASP.NET期望对OnClick标记中的事件的引用.


Ser*_*gan 5

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