Извлечение SelectedValue из подкласса RadioButtonList - PullRequest
0 голосов
/ 15 декабря 2009

Я разделил элемент управления 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>

1 Ответ

1 голос
/ 15 декабря 2009

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

...