PostBack nie działa na stronie ASP wykorzystującej MasterPage

10-Sty-2011

Kiedy na stronie ASP jest używana kontrolka SERVER, to po kliknięciu na niej wykonywana jest metoda __doPostBack(ControlID, Argument). Doprowadza to do wywołania po stronie serwera metody Load dla aktualnej strony, a potem obsługi zdarzenia (w tym przypadku kliknięcia) dla wybranej kontrolki.

Jeżeli po kliknięciu na przycisku ma się zadziać coś jeszcze (można np. uruchomić JavaScript), to przycisk może mieć dodatkowo zdefiniowany skrypt zdarzenia OnClick.

W moim przypadku wyglądało to tak (kod wygenerowaej strony wyświetlany przez przeglądarkę):

<input type=”submit”
       name=”ctl00$MainContent$BtnNewBtnNo”
       value=”No”
       onclick=”document.getElementById(&#39;MainContent_BtnNewDialogResult&#39;).value = &#39;NO&#39;;
                        $find(&#39;BtnNewAspxPanelExtender&#39;).hide();
                       __doPostBack(&#39;ctl00$MainContent$BtnNew&#39;,&#39;&#39;);
                      return false;”
       id=”MainContent_BtnNewBtnNo” />

O ile kod działał poprawnie na pojedynczej stronie ASP o tyle, gdy miał zadziałać na stronie ASP podpiętej pod stronę master, to zaczynały się problemy.

Ogólnie rzecz biorąc, postback się wykonywał, ale nie uruchamiała się instrukcja obsługi kliknięcia po stronie serwera. Mogło się wydawać, że umieszczenie strony w podstronie MasterPage powoduje że zdarzenie PostBack nie działa prawidłowo.

Różne odpowiedzi znajdują Google:

  • Zamiast odwoływać się do __doPostBack(Button1.ID,”) należy wywoływać __doPostBack(Button1.ClientID,”)
  • Zamienić w nazwie kontrolki znaki podkreślenia na $ – http://geekswithblogs.net/mnf/archive/2005/11/04/59081.aspx
  • Zamiast odwoływać się do __doPostBack(Button1.ID,”) należy wywoływać __doPostBack(Button1.Name,”) – trochę czarodziejskie rozwiązanie, więc nawet nie próbowałem
  • Zamiast wywoływać __doPostBack(Button1.ID,”) należy wywołać __doPostBack(Button1.UniqueId,”) http://forums.asp.net/p/1120053/2840896.aspx

U mnie dopiero to ostatnie rozwiązanie zadziałało.

Podsumowując każda kontrolka na stronie ma właściwości:

  • ID – identyfikator kontrolki unikalny w skali określonego zakresu nazw (np strona, kontrolka)
  • ClientID – unikalny identyfikator kontrolki w skali całej strony łącznie ze stroną master. CliendId funkcjonuje po stronie przeglądarki i jest tworzone poprzez dołączenie przedrostka związanego z kontenerem w jakim znajduje się określona kontrolka. Znakiem rozdzielającym w tym przypadku jest znak podkreślenia. Np. jeżeli kontrolka Button1 znajduje się na stronie umieszczonej w stronie master MasterPage1, to jej ID to Button1, zaś jej ClientID to MasterPage1_Button1
  • UniqueID – odpowiednik ClientID, tylko po stronie serwera. Nazwa jest budowana analogicznie jak dla ClientID, z tą różnicą, że znakiem rozdzielającym jest $ np.  MasterPage1$Button1

Pisząc skrypt w JavaScript użyj więc ClientID. Pisząc polecenia po stronie serwera użyj UniqueID. W szczególnym przypadku kiedy strona jest bardzo prosta ID=ClientID=UniqueID.

Dodaj komentarz:

Autor: Rafał Kraik