03. juli 2007 - 23:37Der er
6 kommentarer og 1 løsning
Problemer med IPostBackDataHandler
Kære Eksperter
Jeg har en side der bliver opbygget dynamisk via data fra en database. Der indstættes html elementer ved en override af sidens Render metode.
Mit problem består i, at kunne læse de valg en bruger har foretaget på siden, når denne postes tilbage til serveren.
Min side implementerer IPostBackDataHandler så jeg skulle kunne aflæse de posts der kommer, men jeg kan ikke rigtig finde ud af, at hente de data der bliver postet tilbage.
IPostBackDataHandler.LoadPostData metoden bliver fint nok kaldt, men jeg syntes ikke rigtig jeg kan finde de data jeg har brug for...
Er der nogen der har et virkende eksempel på hvordan man aflæser værdien af elementer der er indsat i en Render metode ved hjælpe af writer.Write()?
Hvis du har en konstruktion alá: protected override void Render(HtmlTextWriter writer) { // some .WriteStuff base.Render(writer); } Vil du få det du renderer ud efter </html> Er det sådan noget du har - eller renderer du hele siden selv?
Som udgangspunkt synes jeg det er en skidt idé, men hvis du sørger for at rendere f.eks. dine inputfelter inde i din form, kan du hente dem med Request.Form["id'et på html-elementet"].
Hvordan kan det være du gør det på den måde... Det er ikke så hmm... ASP.NET-like.
Jeg gør det egentligt for at lege lidt med postbacks af dynamisk oprettede felter. Også for at se hvordan jeg kan fange posts fra andre sites (f.eks gamle ASP eller PHP) til mine sider.
De elementer der genereres, kommer fra en web kontrol der ligger på siden, så dét at spørge på Request.Form["id"], fungerer ikke, da elementerne får et navn ala ctl00$EtEllerAndet$Ctl00@KontrollensID.
Hvis jeg så bare kunne finde ud af, at referere korrekt til felterne med det prefix de får, ville det være fint - og ClientID fungerer ikke her, da ASP.nET som sagt frefixer alle de elementer der oprettes.
Jeg har selv en masse dynamiske kontroller, og de fleste af dem får jeg fat i ved også at lave en eventhandler til dem. Ved postback kan man inde i eventhandleren se det oprindelige ID.
Hvad mener du med "ClientID fungerer ikke her" ? - den bliver jo strikket sammen, som du selv har bemærket (og får en værdi først det øjeblik kontrollen ER placeret i kontroltræet, dvs. assignet til sin parent osv osv).
..og hvis jeg har misforstået det, og du således ønsker at hente værdier på dynamiske felter, men postback er trigget af et andet event, så er der jo altid viewstate - værdierne ligger der jo, når har genskabt kontrollerne ved postback (altså hvis du kører det hele ASP.NET-like, som snepnet bemærker) :)
Jeg har egentligt slettet koden igen koden igen det det funger af h.t., men det jeg gør er nogenlunde sådan hér:
På min Page (som bruger en Master):
<MitTagPrefix:MinKontrol ID="MinKontrol" />
I "MinKontrol" har jeg følgende HTML med i kontrollens designer: <input type="hidden" name="<% =this.UniqueID %>" id="<% = this.UniqueID %>" /> Dette for at få raised events til min IPostBackDataHandler.
I kontrollens Render metode: writer.Write "<input id='MitTekstFelt' name='MitTekstFelt' /">
Når der så laves postbacks til min side (og dermed min kontrol), så forsøger jeg at hente data via Request["MitTekstFelt"], men det giver intet resultat...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.