ASP.Net RadioButton теряет ViewState - PullRequest
0 голосов
/ 13 апреля 2010

У меня проблемы с простым набором радио из двух переключателей (я не хочу использовать RadioButtonList [RBL], потому что RBL не разрешает дочерние элементы управления, и в моем случае, если вы выберете один вариант, Я хочу включить текстовое поле рядом с кнопкой; да, вы можете взломать это с помощью jQuery, чтобы переместить текстовое поле, но это грязно!). Я бы проверил один, отправил форму (явно или через AutoPostBack), и событие CheckedChanged никогда не сработало бы. Когда страница была перезагружена, обе кнопки будут не проверены, независимо от их начального состояния при загрузке без обратной передачи или состояния до отправки формы.

Я снял флажок и опустил его до простейшего примера, который только смог придумать. Я бросил EnableViewState = true повсюду, на случай, если он где-то отключен, и я не могу его найти.

<form id="form1" runat="server" enableviewstate="true">
    <div>
        <asp:RadioButton ID="foo" Text="foo" runat="server" AutoPostBack="true" OnCheckedChanged="rbChanged" Checked="true" GroupName="foobar" EnableViewState="true" />
        <asp:RadioButton ID="bar" Text="bar" runat="server" AutoPostBack="true" GroupName="foobar"
            OnCheckedChanged="rbChanged" Checked="false" EnableViewState="true" />
        <asp:Label runat="server" ID="resultLbl" />
    </div>
</form>

protected void rbChanged(object sender, EventArgs e)
{
    if (foo.Checked) resultLbl.Text = "foo is checked";
    else if (bar.Checked) resultLbl.Text = "bar is checked";
    else resultLbl.Text = "neither is checked";
}

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

Оказывается, это потому, что у нас был специальный адаптер, отображающий HTML-код для радиокнопки (или, если быть точным, для всех System.Web.UI.WebControls.CheckBox es). Мы мотивировали это тем, что .NET поместит атрибут disabled = "disabled" в LABEL, а ввод, который является плохим HTML и, что еще хуже, фактически интерпретируется как нечто для IE! (Проверьте сами - напишите HTML-страницу с меткой disabled = "disabled" и протестируйте в FF и IE.)

Мы использовали Reflector, чтобы увидеть, какой шаг мы перепутали с тем, что сделал настоящий адаптер, и обнаружили, что атрибут Name был установлен неправильно. Хотя он установил для всех RB в данной группе одно и то же имя, в нашем ограниченном тестовом примере с новым решением это был не тот же атрибут имени, как в нашем тестовом примере с пользовательским адаптером. Когда мы посмотрели на то, как создать это безопасно, мы обнаружили, что наши постбэки внезапно сработали!

Если мы получим разрешение от начальника, мы добавим наш адаптер в CSSFriendly на тот случай, если кто-то еще использует подобные вещи.

0 голосов
/ 28 мая 2015

В некоторых случаях проблема может быть вызвана ScriptManager в коде позади.

Например,

ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "DisplayMessage", "javascript: HideProcessingImage();", true);

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

0 голосов
/ 13 апреля 2010

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

...