周囲のスパンとしてではなく、入力タグの一部として CSS クラスを使用してラジオ ボタン コントロールをレンダリングしようとするラジオ ボタン コントロール アダプターがあります。
public class RadioButtonAdapter : WebControlAdapter
{
protected override void Render(HtmlTextWriter writer)
{
RadioButton targetControl = this.Control as RadioButton;
if (targetControl == null)
{
base.Render(writer);
return;
}
writer.AddAttribute(HtmlTextWriterAttribute.Id, targetControl.ClientID);
writer.AddAttribute(HtmlTextWriterAttribute.Type, "radio");
writer.AddAttribute(HtmlTextWriterAttribute.Name, targetControl.GroupName); //BUG - should be UniqueGroupName
writer.AddAttribute(HtmlTextWriterAttribute.Value, targetControl.ID);
if (targetControl.CssClass.Length > 0)
{
writer.AddAttribute(HtmlTextWriterAttribute.Class, targetControl.CssClass);
}
if (targetControl.Page != null)
{
targetControl.Page.ClientScript.RegisterForEventValidation(targetControl.GroupName, targetControl.ID);
}
if (targetControl.Checked)
{
writer.AddAttribute(HtmlTextWriterAttribute.Checked, "checked");
}
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
}
}
現在、これは私が望むものにかなり近いものをレンダリングします。唯一の違いはグループ名属性です (標準のラジオ ボタンは内部値 UniqueGroupName を使用しますが、私は GroupName だけを使用しています。UniqueGroupName を取得する方法が見つからないようです。とにかく、以下の行はこれに対抗する必要があります:
targetControl.Page.ClientScript.RegisterForEventValidation(targetControl.GroupName, targetControl.ID);
標準のラジオ ボタンを使用した古い HTML-
<span class="radio">
<input id="ctl00_ctl00_mainContent_RadioButton1" type="radio" value="RadioButton1" name="ctl00$ctl00$mainContent$mygroup"/>
</span>
新しいレンダリング-
<input id="ctl00_ctl00_mainContent_RadioButton1" class="radio" type="radio" value="RadioButton1" name="mygroup"/>
問題は、ポストバックが機能していないことです。RadioButton1.Checked 値は常に false です。ポストバックでラジオボタンの値を取得する方法についてのアイデアはありますか?