1

周囲のスパンとしてではなく、入力タグの一部として 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 です。ポストバックでラジオボタンの値を取得する方法についてのアイデアはありますか?

4

1 に答える 1

3

ポストバックが機能しない理由は、帰りの旅行でフィールド名が ASP.NET が期待していたものと一致しないためです。したがって、これは理想的なソリューションではありませんが、リフレクションを使用して UniqueGroupName を取得できます。

using System.Reflection;

//snip...

RadioButton rdb = this.Control as RadioButton;
string uniqueGroupName = rdb.GetType().GetProperty("UniqueGroupName",
    BindingFlags.Instance | BindingFlags.NonPublic).GetValue(rdb, null) as string;

または、わかりやすくするために別の行に分割します。

Type radioButtonType = rdb.GetType(); //or typeof(RadioButton)

//get the internal property
PropertyInfo uniqueGroupProperty = radioButtonType.GetProperty("UniqueGroupName",
    BindingFlags.Instance | BindingFlags.NonPublic);

//get the value of the property on the current RadioButton object
object propertyValue = uniqueGroupProperty.GetValue(rdb, null);

//cast as string
string uniqueGroupName = propertyValue as string;
于 2009-10-20T04:53:09.693 に答える