Avatar billede pablopablo Nybegynder
20. oktober 2008 - 12:35 Der 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??

Mvh. PabloPablo
Avatar billede pablopablo Nybegynder
20. oktober 2008 - 12:38 #1
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??
Avatar billede erikjacobsen Ekspert
20. oktober 2008 - 12:40 #2
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.
Avatar billede pablopablo Nybegynder
20. oktober 2008 - 12:45 #3
Måske men...

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"...

Hvad er så løsningen i følge dig?
Avatar billede erikjacobsen Ekspert
20. oktober 2008 - 13:03 #4
1. Må vi se?
2. Nej, du kan ikke veldefineret have et <form>-tag inde i et <form>-tag i HTML.
Avatar billede simsen Mester
20. oktober 2008 - 13:07 #5
Her kan man læse om at have flere form tags på en aspx side - men linket har du jo nok læst, da den stod som nr. 2 på listen i en google søgning  ;-)

http://msdn.microsoft.com/en-us/magazine/cc163736.aspx

hej erik,

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.
Avatar billede erikjacobsen Ekspert
20. oktober 2008 - 13:19 #6
Det pågældende link siger netop ikke at punkt 2 ovenfor er lovligt.
Avatar billede simsen Mester
20. oktober 2008 - 13:26 #7
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 :-)
Avatar billede kalp Novice
20. oktober 2008 - 18:34 #8
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).
Avatar billede erikjacobsen Ekspert
20. oktober 2008 - 19:42 #9
Jeg anfægter kun at anbringe er <form>-tag i et andet <form>-tag - nested, om I vil.
Avatar billede pablopablo Nybegynder
22. oktober 2008 - 20:16 #10
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? :-)

Mvh. PabloPablo
Avatar billede erikjacobsen Ekspert
22. oktober 2008 - 20:23 #11
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".
Avatar billede kalp Novice
22. oktober 2008 - 22:33 #12
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.
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 10:44 #13
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...
        }
    }
}
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 12:24 #14
En anden lille ting...

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... :-/ ?
Avatar billede kalp Novice
23. oktober 2008 - 12:49 #15
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.
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 13:12 #16
Jeg har prøvet alt muligt, men intet virker...

Kan du vise mig noget kode?? Hvor requester jeg hvilken en knap som er blevet klikket??

Jeg har prøvet at dem et hiddenfield...men det bliver resat igen efter et postback trods jeg har sat enableviewstate="true" ?? HELP!
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 13:19 #17
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...??
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 13:34 #18
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!
Avatar billede kalp Novice
23. oktober 2008 - 14:20 #19
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:)
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 14:28 #20
PRÆCIS! Hvordan gør jeg dette, altså sætter en knap's action tag til noget bestemt i load metoden??
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 14:31 #21
jeg ønsker at sammensætte action taget ud fra de modtagne parametre som kommer fra den forrige side af...kan det lade sig gøre?
Avatar billede kalp Novice
23. oktober 2008 - 15:22 #22
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.


if (IsPostBack) {
            string ClickedSubmitOne = Request["ClickedSubmitOne"];
            string ClickedSubmitTwo = Request["ClickedSubmitTwo"];
            string firstname = Request["FirstName"];
            string lastname = Request["LastName"];
            StringBuilder javaScript = new StringBuilder(10);
            javaScript.AppendLine(@"<script type=""text/javascript"">");
            if (!string.IsNullOrEmpty(ClickedSubmitOne)) {
                string magicLine = string.Format("document.getElementById('FormActionChange').setAttribute('action','{0}');", "Default.aspx?Firstname&" + firstname + "&LastName=" + lastname);
                javaScript.AppendLine(magicLine);
            }
            else if (!string.IsNullOrEmpty(ClickedSubmitTwo)) {
                string magicLine = string.Format("document.getElementById('FormActionChange').setAttribute('action','{0}');", "http://google.dk/?Firstname&" + firstname + "&LastName=" + lastname);
                javaScript.AppendLine(magicLine);
            }
            javaScript.AppendLine(@"</script>");
            ClientScript.IsStartupScriptRegistered(this.GetType(), javaScript.ToString());
        }
        }
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 15:46 #23
Jeg har prøvet:

string script = string.Format(@"<script>document.getElementById('FormID').setAttribute('action',mysite.aspx?var1=test');</script>");
            Page.ClientScript.RegisterStartupScript(this.GetType(), "focus", script);

og

string script = string.Format(@"<script>document.PayPalForm.action = ""mysite.aspx?var1=test"";</script>");
            Page.ClientScript.RegisterStartupScript(this.GetType(), "focus", script);

Men i begge tilfælde fejler den ved eksekvering og siger at PayPalForm ikke er et object eller er null...???

Trods jeg også kan tilgå den direkte via JS... ved document.PayPalForm.action... det resultere i samme fejlbesked??
Avatar billede kalp Novice
23. oktober 2008 - 15:48 #24
prøv lige og se om den virker hvis du placere det i din body onload event.

<body onload="document.getElementById('FormID').setAttribute('action',mysite.aspx?var1=test');" />

hvis det virker så kan vi placere den der fra codebehind.. så tjek først:)
Avatar billede kalp Novice
23. oktober 2008 - 15:49 #25
i øvrigt.. der hvor der står "FormID" skal du selvfølgelig angive din forms id..
i dit første eksempel skal den vidst rettes til PayPalForm ?
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 16:02 #26
uanset hvad jeg prøver skriver den...

'document.getElementByUd(...)' er null eller ikke et object..?? :(
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 16:03 #27
men har jeg denne form på siden:

<form id="PayPalForm" action="" method="post">
                <input id="BtnPayPal" type="submit" value="PayPal"/>
            </form>
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 16:07 #28
Hmmm!!

Nu virker nedenstående:

<body onload="document.getElementById('PayPalForm').setAttribute('action','mysite.aspx?var1=test');" >

Hvordan sætter jeg så det samme i code behind så det stadig virker??
Avatar billede kalp Novice
23. oktober 2008 - 16:14 #29
fint..
ret dit body tag til følgende.

<body id="Body" runat="server>

og i codebehind tilføjer du din kode via.

Body.Attributes.Add("onload", "document.getElementById('PayPalForm').setAttribute('action','mysite.aspx?var1=test');");

mener nok det er sådan du tilføjer en attribut.. ellers kan du nemt se det via. intelli-sense..

og så skulle koden fungerer når det er gjort:)
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 16:23 #30
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?
Avatar billede kalp Novice
23. oktober 2008 - 16:24 #31
den bliver rendered som html, så nej det påvirker ikke dine forms:)

lav en test side uden noget på og prøv selv:)
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 16:30 #32
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??
Avatar billede kalp Novice
23. oktober 2008 - 16:40 #33
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');" >
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 16:52 #34
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...? :(
Avatar billede kalp Novice
23. oktober 2008 - 16:57 #35
Du laver vel bare:
<input type="image" src="ditbillede.gif" alt="">

;)
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 17:02 #36
Jeg ønsker at de skal kunne klikke på billedet, altså i stedet for knappen, men så det submitter de samme data...
Avatar billede kalp Novice
23. oktober 2008 - 17:03 #37
Det kan de også hvis du placere den på din form - har du prøvet?
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 17:11 #38
Hvordan ser koden ud så knappen submitter??
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 17:11 #39
knappen = billede!
Avatar billede kalp Novice
23. oktober 2008 - 17:12 #40
det burde den sådan set gøre uden kode!!
men hvis det ikke virker så brug følgende:

<body>
<form id="paypalform" >
<a href="java script:document.getElementById('paypalform').submit()"
onmouseover="document.getElementById('paypalform').submitButton.src='down.jpg'"
onmouseout="document.getElementById('paypalform').submitButton.src='up.jpg'"
onclick="return val_form_this_page()">
<img src="up.jpg"
width="143" height="39" border="0" alt=""
name="submitButton">
</a>
</form>
</body>


Du behøver ikke 2 billeder, men det er for, at gøre det lidt fancy:)

Jeg skal løbe nu, men koden virker.

Hvis du har problemer siger du bare til, så svarer jeg senere.

Ligger et svar hvis det fungere for dig;)
Avatar billede pablopablo Nybegynder
23. oktober 2008 - 17:15 #41
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

Mange tak for hjælpen! Du har reddet min dag ;-)
Avatar billede kalp Novice
23. oktober 2008 - 17:19 #42
ingen årsag:) glad for det hele kom til og fungere;)
tak for point og fortsat god dag:)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester