Finne hvilken kontroll som har ført til Postback av siden

No comments

Av og til er det nødvendig å kunne sjekke hvilken kontrollsom førte til postback.

Det kan f.eks være en side med mange egendefinerte filtreosv, med egendefinert databinding,

hvor hvis man ventet til Eventhandleren for Button ellerDropDown så ville man måtte hente data flere ganger osv.

Page_Load har jo object sender, og hvis man googler litt serman at flere foreslår å caste sender til button.

Det virker dessverre ikke. Når en knapp har postet er detsiden selv som står som sender.

Tilsvarende foreslår mange å bruke"__EventTarget".

Det fungerer fint for dropdowns osv., men igjen, for buttonsog kusinene vil denne ikke virke. Da er eventtarget tom/""

Løsningen for Button og dens venner er (dessverre) å loopeigjennom Request.Form, caste til control, og sjekke om det er en Button.

Hvis ja kan man slutte å loope, da den eneste gangen enbutton vil være i Request.Form-samlingen er hvis det er den som Postet siden.

Krøkkete men funker.

Her er i alle fall en util for å finne kontrollen som harpostet siden:

(en kollega har laget denne, jeg har bare utvidet den med enfiks for Imagebutton)


1 public static class Utils
2 {
3
4 /// <summary>
5 /// Denne funksjonen finne hvilken kontroll som har forårsaket postback på en side.
6 /// </summary>
7 /// <param name="page">Siden vi vil finne postback for</param>
8 /// <returns>Returnerer kontroll som har forårsaket postback</returns>
9 public static Control FinnPostbackControl ( Page page )
10 {
11 Control control = null;
12
13 //Kontroll som forårsaker postback ligger i _EVENTTARGET...
14 string ctrlName = page.Request.Params.Get("__EVENTTARGET");
15 if ( !String.IsNullOrEmpty(ctrlName) )
16 {
17 control = page.FindControl(ctrlName);
18 }
19 else
20 {
21 Control c; //bruker en temp controlholder slik at control==null hvis ikke funnet
22 //...utenom Button, den ligger i Request.Form (ingen andre knapper en postback-knappen vil ligge her)
23 foreach ( string str in page.Request.Form )
24 {
25 //fix for imagebutton-kontroller
26 if (str.EndsWith(".x") || str.EndsWith(".y"))
27 {
28 string nystr = str.Substring(0, str.Length - 2);
29 c = page.FindControl(nystr);
30 if (c is ImageButton)
31 {
32 control = c;
33 break;
34 }
35 }
36 else
37 {
38 c = page.FindControl(str);
39 if (c is Button)
40 {
41 control = c;
42 break;
43 }
44 }
45 }
46 }
47
48 return control;
49 }
50

No comments :

Post a Comment