Пользовательский RadioButtonList теряет значение на PostBack - PullRequest
1 голос
/ 06 мая 2011

Я создал собственный RadioButtonList, который отображается как неупорядоченный список на основе аналогичного примера кода для пользовательского CheckBoxList .

Но по какой-то причине мой выбранный элемент не сохраняется при выполнении обратной передачи. Единственный метод, который я переопределил, это метод Render:

[ToolboxData( "<{0}:ULRadioButtonList runat=server></{0}:ULRadioButtonList>" )]
public class ULRadioButtonList : RadioButtonList {
    protected override void Render( HtmlTextWriter writer ) {
        Controls.Clear();

        string input = "<input id={0}{1}{0} name={0}{2}{0} type={0}radio{0} value={0}{3}{0}{4} />";
        string label = "<label for={0}{1}{0}>{2}</label>";
        string list = "<ul>";

        if ( !String.IsNullOrEmpty( CssClass ) ) {
            list = "<ul class=\"" + CssClass + "\">";
        }

        writer.WriteLine( list );

        for ( int index = 0; index < Items.Count; index++ ) {
            writer.Indent++;
            writer.Indent++;

            writer.WriteLine( "<li>" );

            writer.Indent++;

            StringBuilder sbInput = new StringBuilder();
            StringBuilder sbLabel = new StringBuilder();

            sbInput.AppendFormat(
                input,
                "\"",
                base.ClientID + "_" + index.ToString(),
                base.UniqueID,
                base.Items[index].Value,
                (base.Items[index].Selected ? " checked=\"\"" : "")
            );

            sbLabel.AppendFormat(
                label,
                "\"",
                base.ClientID + "_" + index.ToString(),
                base.Items[index].Text
            );

            writer.WriteLine( sbInput.ToString() );
            writer.WriteLine( sbLabel.ToString() );

            writer.Indent = 1;

            writer.WriteLine( "</li>" );

            writer.WriteLine();

            writer.Indent = 1;
            writer.Indent = 1;
        }

        writer.WriteLine( "</ul>" );
    }
}

Я что-то забыл? Если я использую обычный ASP.NET RadioButtonList, мой выбранный элемент сохраняется после обратной передачи, поэтому больше нет ничего, что переопределяет мое значение; это как-то связано с пользовательским элементом управления.

1 Ответ

0 голосов
/ 06 мая 2011

Чтобы такой подход работал, вы должны сопоставить атрибуты name (и id) в вашей разметке создания с атрибутом RadioButtonList. Итак, очевидная проблема в вашем коде - это значение атрибута name - к нему нужно добавить индекс для каждой переключательной кнопки, т.е.

 ...
 sbInput.AppendFormat(
            input,
            "\"",
            base.ClientID + "_" + index.ToString(),
            base.UniqueID + index.ToString(),    // <<< note the change here
            base.Items[index].Value,
 ...

Также вместо "_" при генерации идентификатора следует использовать свойство ClientIdSeparator .

Наконец, я должен посоветовать вам отказаться от такого подхода к созданию элементов управления, поскольку он по своей природе хрупок, т. Е. Может сломаться, если произойдет изменение в том, как базовый элемент управления ASP.NET генерирует свою разметку. Например, в ASP.NET можно настроить логику генерации идентификатора клиента, и поэтому ваша логика генерации идентификатора может работать неправильно, чтобы соответствовать исходной разметке, сгенерированной базовым элементом управления.

...