代码之家  ›  专栏  ›  技术社区  ›  Stobor

onclick与onclientclick的ASP:复选框?

  •  83
  • Stobor  · 技术社区  · 15 年前

    有人知道为什么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的作用;我想知道为什么复选框不能以同样的方式工作…)

    8 回复  |  直到 15 年前
        1
  •  101
  •   SolutionYogi Eric Lippert    15 年前

    这很奇怪。我检查了 CheckBox documentation page 哪读

    <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);" />
    

    因为浏览器无法理解客户端的单击,所以不会发生任何事情。它也不会引发任何错误,因为它只是另一个属性。

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

    是的,这根本不是直觉。

        2
  •  9
  •   datacop    15 年前

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

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

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

        3
  •  8
  •   russau    15 年前

    你说得对,这是前后矛盾的。正在发生的是,该复选框没有服务器端onclick事件,因此您的标记将呈现到浏览器。 http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx

    而按钮确实有onclick,所以ASP.NET希望在onclick标记中引用一个事件。

        4
  •  5
  •   Serj Sagan    12 年前

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

        5
  •  1
  •   BrianK    14 年前

    我正在清理警告和消息,并看到vs对此发出警告: 验证(ASP.NET):属性“onclick”不是元素“checkbox”的有效属性。使用HTML输入控件指定客户端处理程序,然后就不会得到额外的SPAN标记和这两个元素。

        6
  •  0
  •   slfan Narendra    6 年前

    您可以这样做标记:

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

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

      function checkchanged(obj) {
          alert(obj.checked)
      }
    
        7
  •  0
  •   Ярослав Белобородов    6 年前

    ASP.NET复选框不支持方法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
    
        8
  •  -1
  •   Radouane ROUFID Div    8 年前

    一种解决方案是使用jquery:

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