Извлечение SelectedValue из подкласса RadioButtonList

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

Проблема, с которой я сталкиваюсь, заключается в том, что при доступе к свойству «SelectedValue» я всегда получаю пустую строку. Если я переключусь на суперкласс, я получу правильное значение, поэтому я действительно озадачен... Что мне здесь не хватает?

Мой подкласс не может быть проще:

namespace Internet.Webapp.Controls
{
    public class RadioButtonList : System.Web.UI.WebControls.RadioButtonList
    {
    }
}

Мой адаптер тоже очень простой:

public class RadioButtonListAdapter : System.Web.UI.Adapters.ControlAdapter
{
    // Return a strongly-typed reference
    public new Internet.Webapp.Controls.RadioButtonList Control
    {
        get
        {
            return (Internet.Webapp.Controls.RadioButtonList) base.Control;
        }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        RadioButtonList radioButtonList = Control;

        writer.WriteBeginTag("div");
        writer.WriteAttribute("id", radioButtonList.ClientID);
        writer.Write(HtmlTextWriter.TagRightChar);

        var counter = 0;
        foreach (ListItem item in radioButtonList.Items)
        {
            writer.WriteFullBeginTag("div");

            var itemId = radioButtonList.ClientID + "_" + counter++;

            writer.WriteBeginTag("label");

            writer.WriteAttribute("for", itemId);

            writer.WriteAttribute("value", item.Text); 

            writer.WriteAttribute("class", "long");

            writer.Write(HtmlTextWriter.TagRightChar);

            writer.WriteBeginTag("input");

            writer.WriteAttribute("type", "radio");

            writer.WriteAttribute("id", itemId);

            writer.WriteAttribute("name", radioButtonList.UniqueID);

            writer.Write(HtmlTextWriter.TagRightChar);

            writer.WriteEndTag("input");

            writer.Write(item.Text);

            writer.WriteEndTag("label");

            writer.WriteEndTag("div");
        }
        writer.WriteEndTag("div");
    }
}

Код для заполнения списка переключателей следующий:

var radioButtonList = new Controls.RadioButtonList();

optionsList.ForEach(option => radioButtonList.Items.Add(option));

И сгенерированный html:

  <div id="ctl00_MainSection_CordaanForm_ctl14">
      <div>
        <label for="ctl00_MainSection_CordaanForm_ctl14_0" value="male" class="long">
            <input type="radio" id="ctl00_MainSection_CordaanForm_ctl14_0" name="ctl00$MainSection$CordaanForm$ctl14"></input>
            male
        </label>
      </div>
      <div>
        <label for="ctl00_MainSection_CordaanForm_ctl14_1" value="female" class="long">
            <input type="radio" id="ctl00_MainSection_CordaanForm_ctl14_1" name="ctl00$MainSection$CordaanForm$ctl14"></input>
            female
        </label>
      </div>
  </div>

person Pablo    schedule 15.12.2009    source источник


Ответы (1)


ASP.NET идентифицирует элементы управления по их идентификатору. Вы изменили этот идентификатор при переопределении метода Render, поэтому платформа больше не может его распознавать.

person Oded    schedule 15.12.2009
comment
Спасибо за ответ. Я изменил метод Render, и теперь он выводит те же идентификаторы, что и обычный список радиокнопок. Но я все еще не могу получить свойство SelectedValue. Любые подсказки? - person Pablo; 15.12.2009
comment
Трудно сказать, так как я не знаю, как заполняется RadioButtonList. И просмотр вывода HTML также поможет. - person Oded; 15.12.2009
comment
Просто добавил информацию, которую вы просили. Любая помощь будет очень признательна. - person Pablo; 15.12.2009
comment
Вы ставите значение на метку, а не на ввод! - person Oded; 15.12.2009
comment
Обычно это самое глупое. Спасибо :) - person Pablo; 15.12.2009