C#.Net - Адаптер управления RadioButton и обратная передача
У меня есть адаптер для переключателя, который пытается отобразить элемент управления переключателем с помощью класса 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 всегда ложно. Любые идеи о том, как получить значение переключателя в обратной передаче?
1 ответ
Причина, по которой обратные передачи не работают, заключается в том, что в ответной поездке имя поля не соответствует ожидаемому 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;