OnClick против OnClientClick для asp: CheckBox?

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


person Stobor    schedule 16.07.2009    source источник


Ответы (9)


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

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

person SolutionYogi    schedule 16.07.2009
comment
Хороший звонок. Я только что проверил сгенерированный html, и он фактически помещает атрибуты, которые он не понимает, в диапазон вокруг ввода флажка, но в остальном вы правы ... - person Stobor; 16.07.2009
comment
Это еще одна вещь, мне не нравится тот факт, что asp: checkbox без надобности отображает дополнительный диапазон. - person SolutionYogi; 16.07.2009
comment
Ну некоторые из них. Он помещает onclick в сам вход, но onClientClick в диапазон. Странный! - person Stobor; 16.07.2009
comment
Ух ты. Прошло некоторое время с тех пор, как я использовал веб-элементы управления, поэтому моя память исчезает. Я предпочитаю использовать элементы управления HTML, так как хочу контролировать, как выглядит мой обработанный HTML. - person SolutionYogi; 16.07.2009
comment
но что, если я хочу сделать этот обработчик событий на стороне клиента? - person Joy; 31.12.2012
comment
Эта документация фактически взята из .Net 1.1. Насколько мне известно, ASP .Net не имеет серверного события OnClick для CheckBox, поэтому, когда вы пишете OnClick или OnClientClick, поскольку он этого не знает, он отображает именно то, что вы написали, так как это его поведение по умолчанию ( если я не ошибаюсь) - person Sergio Rosas; 21.06.2013

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

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

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

person datacop    schedule 16.07.2009

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

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

person russau    schedule 16.07.2009

Для тех из вас, кто пришел сюда и искал серверный OnClick обработчик, это OnCheckedChanged

person Serj Sagan    schedule 29.11.2012
comment
Это событие на стороне сервера, а не на стороне клиента; которого не существует. - person Protector one; 14.02.2018

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

person BrianK    schedule 03.10.2010
comment
Интересно ... Это был проект, которым я занимался на некоторое время, и у него было слишком много предупреждений, чтобы увидеть что-нибудь полезное ... Если я правильно помню, обратная сторона использования элемента управления HTML заключается в том, что вы не можете выполнять сервер -боковые манипуляции с ней ... - person Stobor; 04.10.2010

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
person Ярослав Белобородов    schedule 19.12.2018

Сделать тег можно так:

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

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

  function checkchanged(obj) {
      alert(obj.checked)
  }
person Alan Simpson    schedule 14.02.2018

Вы можете назначить функцию всем флажкам, а затем запросить подтверждение внутри них. Если они выберут «Да», флажок можно изменить, если нет, он останется неизменным.

В моем случае я также использую флажок ASP .Net внутри ретранслятора (или сетки) с атрибутом Autopostback = True, поэтому на стороне сервера мне нужно сравнить отправленное значение с тем, что в настоящее время находится в db, чтобы узнать, какое значение подтверждения они выбрали и обновлять БД, только если да.

$(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();
    }
}
person estinamir    schedule 11.01.2021

Одно из решений - JQuery:

$(document).ready(
    function () {
        $('#mycheckboxId').click(function () {
               // here the action or function to call
        });
    }
);
person Philippe    schedule 19.01.2015
comment
Функция Seconf} отсутствует - person Mahdi jokar; 28.07.2016