ASP.NET CheckBox не запускает событие CheckedChanged при снятии отметки - PullRequest
27 голосов
/ 11 августа 2010

У меня есть флажок в форме содержимого ASP.NET, например:

<asp:CheckBox runat="server" ID="chkTest" AutoPostBack="true" OnCheckedChanged="chkTest_CheckedChanged" />

В моем коде есть следующий метод:

protected void chkTest_CheckedChanged(object sender, EventArgs e)
{
}

Когда я загружаю страницув браузере и щелкните флажок, он становится проверенным, страница отправляется обратно, и я вижу, как вызывается chkTest_CheckedChanged.

Когда я снова нажимаю флажок, он становится не проверенным, однако страница отправляется обратно, однако chkTest_CheckedChanged не вызывается.

Процесс повторяется, поэтому, если флажок снят, проверка вызывает событие.

У меня отключено состояние просмотра в Web.Config, что позволяет просматриватьГосударство заставляет эту проблему исчезнуть.Что я могу сделать, чтобы иметь надежное срабатывание события, когда состояние просмотра остается отключенным?

Обновление: Если я установил Checked="true" для тега сервера, ситуация переворачивается при запуске события, когда-проверка CheckBox, но не наоборот.

Обновление 2: Я переопределил OnLoadComplete на своей странице и изнутри я могу подтвердить, что Request.Form["__EVENTTARGET"] установленоправильно к идентификатору моего CheckBox.

Ответы [ 9 ]

24 голосов
/ 28 октября 2013

Чтобы вызвать событие CheckedChanged, установите следующие свойства для CheckBox, свойство AutoPostBack должно иметь значение true и иметь значение по умолчанию, либо флажок false, либо значение true.

AutoPostBack="true" Checked="false"
19 голосов
/ 10 августа 2011

Реализация пользовательского флажка, который хранит свойство Checked в ControlState вместо ViewState, вероятно, решит эту проблему, даже если флажок имеет AutoPostBack=false

В отличие от ViewState, ControlState нельзя отключить, и его можно использовать для хранения данных, важных для поведения элемента управления.

У меня нет сейчас визуальной среды студии для тестирования, но это должно выглядеть так:

public class MyCheckBox : CheckBox
{
    private bool _checked;

    public override bool Checked { get { return _checked; } set { _checked = value; } }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        //You must tell the page that you use ControlState.
        Page.RegisterRequiresControlState(this);
    }

    protected override object SaveControlState()
    {
        //You save the base's control state, and add your property.
        object obj = base.SaveControlState();

        return new Pair (obj, _checked);
    }

    protected override void LoadControlState(object state)
    {
        if (state != null)
        {
            //Take the property back.
            Pair p = state as Pair;
            if (p != null)
            {
                base.LoadControlState(p.First);
                _checked = (bool)p.Second;
            }
            else
            {
                base.LoadControlState(state);
            }
        }
    }
}

подробнее здесь .

8 голосов
/ 05 августа 2011

Не срабатывает, потому что при отключенном viewstate код сервера не знает, что флажок был предварительно установлен, поэтому не знает, что состояние изменилось. Насколько asp.net знает, что флажок не был проверен перед обратной передачей и все еще не проверен. Это также объясняет обратное поведение, которое вы видите при установке Checked="true".

7 голосов
/ 11 сентября 2014

Это старый пост, но мне пришлось поделиться своим простым решением, чтобы помочь другим, кто искал эту проблему.

Решение простое: Включите AutoPostBack.

        <asp:CheckBox id="checkbox1" runat="server"
                AutoPostBack="True" //<<<<------
                Text="checkbox"
                OnCheckedChanged="knowJobCBOX_CheckedChanged"/>
6 голосов
/ 27 марта 2012

Я не уверен, но думаю, что мое решение работает только для .NET Framework 4.0:

Используйте ViewStateMode = "Disabled", чтобы отключить состояние просмотра, установленное для EnableViewState="false".Это предупредит то же поведение, за исключением того, что вы можете сохранить локальное состояние просмотра.

Таким образом, установите флажок в свой флажок ViewStateMode = "Enabled", и проблема будет решена без применения пользовательского флажка.

1 голос
/ 06 августа 2011

Я хотел немного привести в порядок вещи, поэтому потратил немного времени на тестирование решения для этого.

Джошб прав, объясняя, почему CheckBox ведет себя так, как он.

Поскольку я не знаю, как я обошел это в прошлом году, или даже если бы я сделал (я не могу вспомнить, над чем я работал в то время, чтобы проверить), я составил простое решение /Обходной путь.

public class CheckBox2 : CheckBox
{
    protected override bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
    {
        bool isEventTarget = postCollection["__EVENTTARGET"] == UniqueID;
        bool hasChanged = base.LoadPostData(postDataKey, postCollection);
        hasChanged = hasChanged || isEventTarget;
        return hasChanged;
    }
}

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

Способ, которым это работает, позволяет обычному CheckBox выполнять свою работу с проверкой и проверкой изменений, но затем выполняет дополнительную проверку, чтобы выяснить, не было ли это целью события, вызвавшего обратную передачу.Если он был целью, он возвращает true, чтобы сообщить фреймворку, что нужно вызвать событие CheckedChanged.

Редактировать: Обратите внимание, что это только решает проблему для AutoPostBack на CheckBox.Если PostBack вызывается из чего-либо еще (например, кнопки), событие CheckedChanged по-прежнему демонстрирует наблюдаемую проблему.

0 голосов
/ 07 января 2016

Очень простой ответ - включить ViewState для этого элемента управления.

Просто добавьте EnableViewState="true" к свойству AutoPostBack="true" в теге флажка.

0 голосов
/ 22 декабря 2015

Дополнительно: Проверка на наличие ошибок в консоли JavaScript .

Я столкнулся с той же самой проблемой, описанной OP, за исключением того, что она произошла только в Safari (checkbox нормально работала в Chromeи Firefox).Осмотрев консоль JavaScript, я обнаружил ошибку, выдаваемую искаженным селектором jQuery.

В моем случае у меня было $('a[id*=lbView'), в котором отсутствовал закрывающий ].Это привело к ошибке в Safari, но, к удивлению, ни в Chrome, ни в Firefox.

0 голосов
/ 19 февраля 2014

У меня была такая же проблема.Я потратил много времени на это и наконец решил.

В моем случае Checkbox было отключено по умолчанию:

<asp:CheckBox ID="chkActive" runat="server" Enabled="false"/>

Оказывается ViewState незагружен для отключенных или невидимых элементов управления.Так что удалите Enabled="false" или Visible="false", и он будет работать как исключено.И, конечно, ViewState не следует отключать.

...