none
LinkButton в ASP.NET становится невидимым. RRS feed

  • Вопрос

  • Помогите разобраться, пожалуйста. Похоже на баг.

    Сделал простенькую демку 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.

    • Предложено в качестве ответа YatajgaEditor 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.

    • Предложено в качестве ответа YatajgaEditor 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