2011-05-06 52 views
1

我创建了一个基于类似code example for a custom CheckBoxList呈现为无序列表的自定义RadioButtonList。自定义RadioButtonList丢失回传值

但由于某种原因,我的选定项目在执行回发时未保存。 我overrided的唯一方法是渲染法:

[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,则在回发后保存我选择的项目,所以没有任何内容覆盖我的值;它与自定义控件有关。

回答

0

对于这样的方法来工作,你必须匹配name(和id)在与的RadioButtonList生成标记属性。因此,在你的代码明显的问题是name属性值 - 它应该与每个单选按钮的索引被追加即

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

,而不是同样“_”的ID生成,你应该使用ClientIdSeparator属性。

最后,我必须建议您采用这种控制创作方法,因为它本质上很脆弱,即如果底层ASP.NET控件如何生成其标记,它可能会中断。例如,在ASP.NET中,可以配置客户端ID生成逻辑,因此您的ID生成逻辑可能无法正确匹配基本控件生成的原始标记。

+0

名称属性必须与我列表中的所有单选按钮相同,否则我可以选择多个单选按钮,这不是单选按钮的用途。 – thomasvdb 2011-05-06 09:23:03

+0

@thomasvb,是的 - 我在提示更改名称属性时出错 - 我只是交叉检查并且ASP.NET也生成了相同的名称属性。在这种情况下,我认为这个问题可能与身份证生成有关。我会建议你评论你的渲染实现,并查看生成的单选按钮的ID并将其与渲染实现生成的ID进行比较。 – VinayC 2011-05-09 04:08:05