Я вижу странное поведение в стандартном элементе управления ASP.NET CheckBox. Вот репродукция:
Разметка ASPX
<form runat="server">
<asp:CheckBox runat="server" ID="cb" Text="Foo" />
<asp:Button runat="server" Text="Submit" />
</form>
C # code-behind
protected override void OnLoad(EventArgs e)
{
if (!IsPostBack)
{
cb.Attributes.Add("data-a", "1");
cb.InputAttributes.Add("data-b", "2");
cb.LabelAttributes.Add("data-c", "3");
}
}
При первоначальном запросе страницы элемент управления CheckBox отображает все три атрибута data
:
<span data-a="1"> <!-- RIGHT -->
<input id="cb" type="checkbox" name="cb" data-b="2" /> <!-- RIGHT -->
<label for="cb" data-c="3">Foo</label> <!-- RIGHT -->
</span>
Но после нажатия кнопки «Отправить» элемент управления CheckBox отображает только атрибут data-a
:
<span data-a="1"> <!-- RIGHT -->
<input id="cb" type="checkbox" name="cb" /> <!-- WRONG -->
<label for="cb">Foo</label> <!-- WRONG -->
</span>
Почему InputAttributes и LabelAttributes отсутствуют после обратной передачи?
Heisenbug Alert: Если я установил точку останова в OnLoad, нажмите кнопку, а затем проверьте значения cb.Attributes["data-a"]
, cb.InputAttributes["data-b"]
и cb.LabelAttributes["data-c"]
, тогда значения будут 1
2
и null
(вместо 3
) соответственно. Кроме того, проверка значений влияет на вывод!
<span data-a="1"> <!-- RIGHT -->
<input id="cb" type="checkbox" name="cb" data-b="2" /> <!-- RIGHT -->
<label for="cb" data-b="2">Foo</label> <!-- WTF?! -->
</span>