OnClick против OnClientClick для asp: CheckBox? - PullRequest
83 голосов
/ 16 июля 2009

Кто-нибудь знает, почему обработчик JavaScript на стороне клиента для asp: CheckBox должен быть атрибутом 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 не работает так же ...)

Ответы [ 8 ]

103 голосов
/ 16 июля 2009

Это очень странно. Я проверил страницу 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.

И да, это совсем не интуитивно понятно.

9 голосов
/ 16 июля 2009

Потому что это два разных вида управления ...

Видите ли, ваш веб-браузер не знает о программировании на стороне сервера. он знает только о своем собственном 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);" />

Теперь, насколько я помню, нигде нет браузеров, которые поддерживают событие "OnClientClick" в их DOM ...

Если вы сомневаетесь, всегда просматривайте источник вывода, как он отправлен в браузер ... есть целый мир отладочной информации, которую вы можете видеть.

8 голосов
/ 16 июля 2009

Вы правы, это противоречиво. Происходит следующее: CheckBox не ИМЕЕТ серверного события OnClick, поэтому ваша разметка отображается в браузере. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx

Принимая во внимание, что Button имеет OnClick - поэтому ASP.NET ожидает ссылку на событие в вашей разметке OnClick.

5 голосов
/ 29 ноября 2012

Для тех из вас, кто ищет здесь серверный обработчик OnClick, он OnCheckedChanged

1 голос
/ 04 октября 2010

Я убирал предупреждения и сообщения и вижу, что VS предупреждает об этом: Проверка (ASP.Net): атрибут «OnClick» не является допустимым атрибутом элемента «CheckBox». Используйте элемент управления вводом html, чтобы указать обработчик на стороне клиента, и тогда вы не получите дополнительный тег span и два элемента.

0 голосов
/ 19 декабря 2018

Asp.net CheckBox не поддерживает метод OnClientClick.
Если вы хотите добавить какое-либо событие javascript в asp: CheckBox, вам нужно добавить связанные атрибуты для событий «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
0 голосов
/ 15 февраля 2018

Вы можете сделать тег следующим образом:

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

Свойство .checked в вызываемом JavaScript будет правильным ... текущее состояние флажка:

  function checkchanged(obj) {
      alert(obj.checked)
  }
0 голосов
/ 19 января 2015

Одно решение с JQuery:

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