piątek, 24 lutego 2012

EVENTARGUMENT, EVENTTARGET i postback w ASP.NET

Dzisiaj wyjatkowo poruszę temat nie związany z SQL-em.
W ASP.NET do obslugi postback wykorzystywane są dwa ukryte pola na formularzu oraz funkcja javascript. Problem polega na tym , że ASP.NET generuje domyślnie ten kod tylko w przypadku gdy na formularzu występuje kontrolka, która tego wymaga. Może to być np. LinkButton, TextBox, CheckBox, DropDownList (właściwość AutoPostBack musi być ustawiona na true).
W przypadku gdy powyższe jest spełnione to podglądając kod HTML zobaczymy następujący kod
   1: <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
   2: <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
   1: <script type="text/javascript">
   1:  
   2: //<![CDATA[
   3: var theForm = document.forms['Form1'];
   4: if (!theForm) {
   5:     theForm = document.Form1;
   6: }
   7: function __doPostBack(eventTarget, eventArgument) {
   8:     if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
   9:         theForm.__EVENTTARGET.value = eventTarget;
  10:         theForm.__EVENTARGUMENT.value = eventArgument;
  11:         theForm.submit();
  12:     }
  13: }
  14: //]]>
</script>

Niestety powyższe nie jest generowane przez kontrolki Button i ImageButton.

W przypadku gdy z jakiegoś powodu jest to wymagane to wtedy trzeba sobie radzić w inny sposób i np w funkcji Page_Load dopisać kod, który doda powyższe dwie ukryte kontrolki jak również javascript.

Przykład implementacji takiego rozwiązania można jest np tutaj.

Dlaczego o tym pisze? A to dlatego, że miałem cały dzień zepsuty przez to, że ktoś próbował wykorzystać EVENTARGUMENT w funkcji, która obługiwała zdarzenie OnClick dla ImageButton.

Wszystko byłoby w porządku, pod warunkiem gdy kod ten nie nadawał się do thedailywtf.com.