我想你是在談論RadioButtonList。問題在於它使用RadioButton控件,它有3個屬性屬性 - 屬性,InputAttributes和LabelAttributes。它們中的每一個都用於特定的html元素。
RadioButtonList的問題在於它僅使用Attributes屬性,並且不使用InputAttributes。這裏是RadioButtonList.RenderItem方法的代碼:
protected virtual void RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)
{
if (repeatIndex == 0)
{
this._cachedIsEnabled = this.IsEnabled;
this._cachedRegisterEnabled = this.Page != null && !this.SaveSelectedIndicesViewState;
}
RadioButton controlToRepeat = this.ControlToRepeat;
int index1 = repeatIndex + this._offset;
ListItem listItem = this.Items[index1];
controlToRepeat.Attributes.Clear();
if (listItem.HasAttributes)
{
foreach (string index2 in (IEnumerable) listItem.Attributes.Keys)
controlToRepeat.Attributes[index2] = listItem.Attributes[index2];
}
if (!string.IsNullOrEmpty(controlToRepeat.CssClass))
controlToRepeat.CssClass = "";
ListControl.SetControlToRepeatID((Control) this, (Control) controlToRepeat, index1);
controlToRepeat.Text = listItem.Text;
controlToRepeat.Attributes["value"] = listItem.Value;
controlToRepeat.Checked = listItem.Selected;
controlToRepeat.Enabled = this._cachedIsEnabled && listItem.Enabled;
controlToRepeat.TextAlign = this.TextAlign;
controlToRepeat.RenderControl(writer);
if (!controlToRepeat.Enabled || !this._cachedRegisterEnabled || this.Page == null)
return;
this.Page.RegisterEnabledControl((Control) controlToRepeat);
}
controlToRepeat是單選按鈕,而且只規定了財產的屬性,而忽略InputAttributes。
我可以建議修復它的方法 - 您可以創建繼承RadioButtonList的新類,並使用它來代替默認值。下面是類代碼:
public class MyRadioButtonList : RadioButtonList
{
private bool isFirstItem = true;
protected override void RenderItem(ListItemType itemType, int repeatIndex, RepeatInfo repeatInfo, HtmlTextWriter writer)
{
if (isFirstItem)
{
// this.ControlToRepeat will be created during this first call, and then it will be placed into Controls[0], so we can get it from here and update for each item.
var writerStub = new HtmlTextWriter(new StringWriter());
base.RenderItem(itemType, repeatIndex, repeatInfo, writerStub);
isFirstItem = false;
}
var radioButton = this.Controls[0] as RadioButton;
radioButton.InputAttributes.Clear();
var item = Items[repeatIndex];
foreach (string attribute in item.Attributes.Keys)
{
radioButton.InputAttributes.Add(attribute, item.Attributes[attribute]);
}
// if you want to clear attributes for top element, in that case it's a span, then you need to call
item.Attributes.Clear();
base.RenderItem(itemType, repeatIndex, repeatInfo, writer);
}
}
說明的一點 - 它有isFirstItem財產,爲使用它在第一次訪問運行時創建單選按鈕控制,所以我們需要調用RenderItem纔可以更新InputAttrubutes屬性。所以我們調用它一次併發送一些存根HtmlTextWriter,所以它不會顯示兩次。然後,我們只需將這個控件作爲Controls [0],並且爲每個ListItem我們更新InputAttributes值。
PS。對不起,我沒有使用VB.Net所以控制是用C#編寫的。
CheckboxList項是否遭受同樣的問題,因此也需要覆蓋? –
另外,如何防止它在兩個位置呈現屬性呢?現在我正在獲取span標籤和輸入標籤的屬性。所以這是另一個問題。 –
是的,CheckBoxList有同樣的問題。但是,對於使用RadioButton控件的RadioButtonList,CheckBoxList使用CheckBox控件。 RadioButton繼承了CheckBox。 –