2009-12-15 53 views
0

为了创建一个按照我想要的方式输出HTML的控件适配器(这是我第一次写适配器),我已经创建了RadioButtonList控件的子类。从RadioButtonList子类中获取SelectedValue

我面临的问题是当访问“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

ASP.NET通过ID标识控件。您在Render方法的重写中更改了该ID,因此该框架无法再识别它。

+0

感谢您的反馈意见。我修改了Render方法,现在它输出与普通单选按钮列表相同的ID。但我仍然无法获得SelectedValue属性。任何提示? – Pablo 2009-12-15 12:24:50

+1

很难说,因为我不知道如何填充RadioButtonList。看到HTML输出也会有所帮助。 – Oded 2009-12-15 12:32:10

+0

刚刚添加了您询问的信息。任何帮助将非常感激。 – Pablo 2009-12-15 12:54:23