20. oktober 2008 - 12:35Der er
41 kommentarer og 1 løsning
Klik event og forms
Hejsa...
Jeg har en asp.net 2.0 site...jeg benytter masterpages og contentpages...
Jeg et meget simpelt spørgsmpl hertil.
Hvis jeg smider en knap på en content page, køre sitet så kan jeg udløse en click event ved at klikke på knappen som normalt...MEN hvis jeg samtidig smider en form på som submitter data på samme site...så virker min alm. knap nu pludselig ikke?? Hvorfor pokker gør den ikke det?? Dvs. eventen bliver aldrig udløst når jeg efterfølgende klikker på knappen??
What?! Har lige fundet ud af, at hvis jeg smider knapper ovenover formen så virker det fint, men hvis knappen ligger uder formen så virker det ikke... kan det virkelig passe??
En ASP.NET 2.0 site indeholder altid en overordnet <form>, hvori al indhold er. Man kan ikke i HTML have et <form>-tag inden i et <form>-tag - det er ikke veldefineret, og browsere reagerer forskelligt.
Ja, det er en kendt svaghed ved hidtidige ASP.NET sider.
1. Jeg har også prøvet at ligge det i en seperat aspx side, dvs. som ikke arver noget form tag og der er outputtet det samme...? 2. Form tag kan da god indeholde form tag...man kan bare ikke sættes begge til runat="server"...
Som jeg læser linket, kan man godt have flere formtags....så længe der kun er ét af dem (altså med runat=server), der er synlige ad gangen.
Det er så også muligt at have både server (én) og en til flere client form tags på en side, hvor man så skal ind på godt gammeldags vis, og hente posted data.
Det er vi enig i - men det kan lade sig gøre..... Personligt ville jeg aldrig selv have mere end én form på en side. Kan ikke se begrundelsen for flere forms :-)
En contentpage behøver ikke nødvendigvis og indeholde en form. Den arver det f.eks fra sin masterpage. Det lyder det som om i dette tilfælde. Den "fejl" begik jeg kun en gang det det skabte en masse bøvl synes jeg.
I øvrigt så må man ikke have flere forms med runat="server" som allerede nævnt. Men på samme site kan man godt have flere forms hvis ikke de er nested i hinanden.
document.forms er trods alt et array der returnere alle forms på et site. Hvis det skulle være fuldstændig forkert og have flere forms på en html side, så bør den gøres absolute så man ikke benytter den:) Eftersom den ikke er må det vel være gyldigt nok (uden at have undersøgt det nærmere eller læst det link i har lagt i tråden her).
Hej alle sammen...mange tak for alle jeres indlæg...
For at opsumere: Jeg benytter masterpage/contentpages normalt... idet vi skulle integrere vores løsning til PBS så havde jeg brug for en form som postede data dertil...
Denne form kunne jeg ikke få til at virke ved at lægge den i en content page... derfor opretede jeg en seperat aspx side som jeg så designede så den lignede alle de andre sider, som ellers arver fra masterpagen. Alt dete virkede fint...
Jeg fik så efterfølgende brug for, at tilføj en server kontrol, en knap, som kaldte noget kode server side...og det var så her det reele problemet kom ind i billedet... fordi den kræver jo, at den ligger i et form tag hvori runat="server" er sat...udover denne kontrol, havde jeg også brug for at placere flere forskellige server controls på samme side...men placeret forskellige steder på siden...og det var så der jeg rent fysisk/designmæssigt løb ind i en mur, da min PBS form jo ikke også må ligge inde i en anden form med runat="server" sat til...og det kunne jeg ikke undgå, når jeg heller ikke må oprette mere end et form tag med runat="server" sat ...?? :(
Jeg vil senere også have brug for at tilføje endnu flere forms til samme side, idet det er en side, hvor brugeren kan vælge imellem mange forskellige betalingsmuligheder...såsom Dankort, E-dankort, paypal, ewire osv...og de benytter jo alle forskellige forms til at poste data...
Min løsing på problemet pt. er blevet, at lægge en side ind imellem de andre sider, således at brugeren først vælger hvilket betalingsmiddel han ønsker at anvende og derefter sendes videre til en specifik side hvor den nødvendige form/server controls så findes...
Men er det virkelig ikke muligt, at tilføje fx. 2 forms (unden runat="server" sat) Plus at man har fx. 3 server controls placeret på en og samme side? Det ville trods alt virke lidt pænere for brugeren, hvis det kunne lade sig gøre?
Håber i kan følge mig, trods min lidt lange forklaring? :-)
Jo, jeg følger dig. Og nej, man kan ikke have <form> i <form>, men gerne ved siden af hinanden. Det er og har altid været et (lille) problem at ASP.NET sider absolut skal have en <form> uden om "alt".
hvorfor kan du ikke skrive runat="server" på din form fra PBS? hvis den ligger på din ASPX side så kan du vel også??
men ellers kan du vel løse det ved og lave ganske normale forms uden runat="server" på.
hvis du f.eks skal afvikle noget kode server site så kan du oprette en ganske normal form, men en ganske normal submit knap på. Trykker man på den vil den poste sig selv. Det betyder, at din page load vil blive afviklet igen pga. post back og heri kan du requeste og tjekke på hvilken knap der er trykket på:) hvis knappen er blevet trykket, så kan du afvikle din kode.
Der er vel ingen grund til den SKAL ligge i et OnClick event eller hvad??
Ud fra den information du har givet indtil videre, så vil fremgangsmåden i hvertfald fungere.
Hej Kalp>> Nej det skal ikke absolut ligge i en OnClick event men det synes jeg bare bedst om... men der blivet postet data til den side vi nu snakker om, nogle af data skal så bruges til både PSB submit-form (uden runat="server" sat) PLUS til min server side knap, idet den skal redirecte til PayPal og sender hermed de postede data med som querystrings...
Det du har forklaret forstår jeg som nedenstående eksempel i psydokode :-) Korrekt?
PageLoad() { if(alle modtaget posted data != null) { if(sender == PayPalKnap) { Redirect(... brug her div. hiddenfields values... } else { Glem div. modtaget data i hiddenfields for at have dem tilgængelige efter et evt. postback... } } }
Jeg kan ikke se hvilken en knap som tricker load metoden...hvordan tjekker jeg det... Men server controls plejer man at kunne bruge sender.GetType()... Men det returnere altid bare navnet på min aspx side... :-/ ?
hmm.. jeg kan ikke huske om øvrige submit knapper vil give "null" hvis du requester dem og de ikke er blevet trykket på.. det kan du hurtigt teste. Hvis de er null så er problemet løst:)
hvis ikke, så kan du tilføje et hiddenfield til din form hvor du via. javascript opdatere dens værdi når man trykker på en knap - opdatere dens værdi med knappens ID evt.
og så kan du teste på den i din page load:)
i øvrigt så flytter du bare logik ud fra din page load så din page load kalder private metoder, som afvikler diverse logik. Det ville være pænest.
Jeg kan hurtigt finde ud af hvilken knap som bliver klikket ved at benytter query strings med i postet! :-) Det er godt og lige til.
Men jeg kan ikke bevare de data jeg modtog i det første post fra den forrige side... har som sagt prøvet at gemme det i hiddenfields med enableviewstate="true" med de er bare tomme...??
En anden mere direkte løsning kunne være, at sætte min PayPal knap's action tag serverside hvis det kan lade sig gøre? Så ville det da klart være at foretrække!
Det får du svært ved når du ikke kan benytte runat="server" :)
EnableViewState fungerer ikke fordi du ikke benytter ASPX kontroller;)
men hvis det løser dit problem blot og kunne ændre på din forms action tag, så lav et javascript som du tilføjer fra din codebehind (kan fortælle hvordan hvis ikke du ved det).. men dette javascript skal blot på ændre din forms action tag når siden er loaded:)
Dette er på ingen måder afprøvet, men det skal bare give dig en idé om ikke andet. Det vigtigste for dig er denne javascript kode: document.getElementById('FormID').setAttribute('action','nyUrlMedParametrer') som heller ikke er testet:P så jeg slår fast igen - det skal give dig en idé til hvad jeg har i tankerne.
okay...men <body id="Body" runat="server> man bare lige for at forstå det... hvordan bliver den linie rederet i html? Jeg tænkter på, det påvirker ikke noget forms negativt?
men hvordan skal det forstås at body sættes til runat="server"...svarer det ikke til at indkapsle alt indhold i en site med et form tag hvor runat="server" er sat...men åbenbart uden at det påvirker andre forms eller??
Du ser på det med "kode" øjne lige nu. Det skal du ikke. Se på det fra klienten af. Når han modtager din html side vil den være idendisk om du har placeret et runat="server" attribut på dit <body> tag eller ej. Det er kun dit <form> tag, som .NET vil forstå anderledes med runat server på - dermed også placere lidt ekstra linjer i html sourcen. En form med runat="server" på benyttes nemlig i .NET til at kunne afvikle .NET kontroller med.
Du kan f.eks prøve og placere nogle .NET kontroller på din side nu hvor du runat="server" på dit body tag. Det vil ikke ligefrem fungere:)
Pointen er, at du kan sagtens gøre det på dit body tag - det bliver alligevel det samme resultat hos klienten, som denne kode du siger fungerer: <body onload="document.getElementById('PayPalForm').setAttribute('action','mysite.aspx?var1=test');" >
OK! Jamen det giver jo fin mening! Ønsker bare også at forstår det og ikke kun få det til at virke ;-)
Du skal nok få dine velfortjente points! Men skal lige høre dig, ved du hvordan jeg udskifter men eller i hvert fald styler submit knappen, således at brugeren klikker på et PayPal GIF i stedet for en standard knap...IE 7 reagerer ikke på de mange forskellige forsøg jeg har afprøvet via CSS...? :(
sorry, viste ikke at man bare kunne indsætte en image tag i form så det automatisk også submitter...underligt, når det ikke har et type felt som er sat til submit? Men cool at det virker...det tror jeg altså ikke der at mange som ved, der er i hvert fald rigtig mange som har spurgt om hvordan man styler en knap med at billede... :D
ingen årsag:) glad for det hele kom til og fungere;) tak for point og fortsat god dag:)
Synes godt om
Ny brugerNybegynder
Din løsning...
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.