Лучший отвечающий
LinkButton в ASP.NET становится невидимым.

Вопрос
-
Помогите разобраться, пожалуйста. Похоже на баг.
Сделал простенькую демку http://bel.sposad.ru/tmp/WebApplication2.rar
Есть страница default и 3 контрола. Action1, Action2 и ErrorBox. На Action1 и Action2 расположен ErrorBox. На Action2 так же присутствует две LinkButton.
ErrorBox в Page_Load делает себя невидимым. (this.Visible = false). А заодно, каким-то образом, цепляет и первый LinkButton после себя, но при условии, что после кнопок на страница ascx есть исполяемый код (кавычкопроценты). В демке по умолчанию грузится Action2. Если нажать кнопку Action1, а потом снова Action2, то можно увидеть как пропадет LinkButton1.
PS: Если делать this.Visible = false для ErrorBox в Page_Init, то пропажи кнопок не наблюдаю. Все эти непонятные условности наводят на мысль об ошибке в ASP.NET.
26 апреля 2012 г. 15:54
Ответы
-
Это не баг в ASP.NET. Скорее, неправильная работа с контролами.
Видимость контролов, вместе с остальными свойствами, в WebForms сохраняется во ViewState. Сама по себе работа с ViewState построена на предположении, что загружается он для того же дерева контролов, для которого был сохранен. Что происходит у вас в демо:
1. При первом заходе сохраняется вьюстейт для Default с Action2 в плейсхолдере.
2. При клике по "Action1" вы вместо контрола с типом Action2 создаете в том же месте (и с тем же ID) контрол типа Action1. ASP.NET это кое-как проглатывает (потому что контролы похожи), но ViewState в контрол Action1 он подсовывает от старого Action2.
3. При клике по "Action2" вы вместо контрола с типом Action1 (для которого в прошлый раз стейт сохранили) создаете в том же месте (и с тем же ID) контрол типа Action2. ASP.NET опять это проглатывает, но ViewState в контрол Action2 он подсовывает от старого Action1.
В Action1 у вас три контрола:
- Literal
- ErrorBox
- Literal
В Action2 тоже три:
- ErrorBox
- LinkButton
- LinkButton
В результате в (3) LinkButton у вас получает вьюстейт от ErrorBox, вместе с Visible = false;
На Action1 есть кавычкопроценты, поэтому в списке контролов есть литералы. Если проценты убрать - ErrorBox станет нулевым в списке контролов, и начнет удачно попадать на ErrorBox на Action2. То же самое будет, если добавить кавычкопроценты на Action2.
>> Если делать this.Visible = false для ErrorBox в Page_Init, то пропажи кнопок не наблюдаю.
Потому что во вьюстейт (поле на странице) сохраняются только изменения сделанные после Init. Например, во вьюстейт не попадают значения свойств, вписанные прямо в aspx/ascx.
- Предложено в качестве ответа YatajgaModerator 26 апреля 2012 г. 18:29
- Помечено в качестве ответа ulcerModerator 26 апреля 2012 г. 18:33
26 апреля 2012 г. 17:14
Все ответы
-
Это не баг в ASP.NET. Скорее, неправильная работа с контролами.
Видимость контролов, вместе с остальными свойствами, в WebForms сохраняется во ViewState. Сама по себе работа с ViewState построена на предположении, что загружается он для того же дерева контролов, для которого был сохранен. Что происходит у вас в демо:
1. При первом заходе сохраняется вьюстейт для Default с Action2 в плейсхолдере.
2. При клике по "Action1" вы вместо контрола с типом Action2 создаете в том же месте (и с тем же ID) контрол типа Action1. ASP.NET это кое-как проглатывает (потому что контролы похожи), но ViewState в контрол Action1 он подсовывает от старого Action2.
3. При клике по "Action2" вы вместо контрола с типом Action1 (для которого в прошлый раз стейт сохранили) создаете в том же месте (и с тем же ID) контрол типа Action2. ASP.NET опять это проглатывает, но ViewState в контрол Action2 он подсовывает от старого Action1.
В Action1 у вас три контрола:
- Literal
- ErrorBox
- Literal
В Action2 тоже три:
- ErrorBox
- LinkButton
- LinkButton
В результате в (3) LinkButton у вас получает вьюстейт от ErrorBox, вместе с Visible = false;
На Action1 есть кавычкопроценты, поэтому в списке контролов есть литералы. Если проценты убрать - ErrorBox станет нулевым в списке контролов, и начнет удачно попадать на ErrorBox на Action2. То же самое будет, если добавить кавычкопроценты на Action2.
>> Если делать this.Visible = false для ErrorBox в Page_Init, то пропажи кнопок не наблюдаю.
Потому что во вьюстейт (поле на странице) сохраняются только изменения сделанные после Init. Например, во вьюстейт не попадают значения свойств, вписанные прямо в aspx/ascx.
- Предложено в качестве ответа YatajgaModerator 26 апреля 2012 г. 18:29
- Помечено в качестве ответа ulcerModerator 26 апреля 2012 г. 18:33
26 апреля 2012 г. 17:14 -
Спасибо за ответ. Очень доступно. Разобрался26 апреля 2012 г. 17:56
-
Пожалуйста, не забывайте отмечать ответ, решающий вашу проблему. Для этого есть кнопка "Пометить как ответ" под сообщением. Спасибо.
Для связи [mail]
27 апреля 2012 г. 5:45Модератор -
Пожалуйста, не забывайте отмечать ответ, решающий вашу проблему. Для этого есть кнопка "Пометить как ответ" под сообщением. Спасибо.
Для связи [mail]
27 апреля 2012 г. 11:29