30. marts 2005 - 09:43Der er
31 kommentarer og 1 løsning
Fejl i kørsel af script på server
Hvorfor vil mit javascript ikke køre, når jeg lægger det op på en server? Når jeg tester det lokalt på min maskine, så fungerer det fint. Selve scriptet ser således ud:
hmm - tja i asp-linien står der runat=server. Men der skal jo egentlig stå runat=client, ik'? Jeg har ikke byttet om på noget kode, så jeg kalder den vel på samme måde.
<!-- --> var i det eksempel, hvor jeg snuppede noget af koden fra. Da jeg lærte noget om javascript i sin tid mener jeg, at de tags er til, at at ældre browsers, som ikke kan forstå koden, helt ignorerer koden, da det så står som udkommenteret. Men der husker jeg måske lidt forkert?
det ligner klient kode vil jeg sige, og du har ret med <!-- -->
Det er placeringen der undrer mig, det er ikke omkring det hele. hvis du vil køre det på klienten, skal du bare fjerne runat=server, for den kører som standard på klienten.
Slet <!-- -->. Det er korrekt, de er til for at skjule koden for ikke JS-enabled browsere, men de skal ikke stå dér :) Derudover skal du være opmærksom på, at JS - som alle ordentlige sprog - naturligvis er casesensitive. Derfor skal du skrive 'value' ... ikke 'Value'.
"og scriptet kaldes således: ....ClientValidationFunction="check"...."
Nej, sådan kan man ikke kalde noget i JavaScript - men hvad der skal stå, er ikke til at sige udfra det, du opgiver her.
mappen hedder aspnet_client og bruges af asp.net til client side validation og smart navigation. Den bliver automatisk oprettet når .net bliver registreret med IIS, men det kan være det er glippet.
Så forstår jeg bedre ... scriptet kaldes ikke med ClientValidationFunction="check" via JavaScript - men .net. Det er jo noget helt andet ;o) Hvad jeg skrev vedr. JS-escapes og casesensitivity er nu stadig gældende og bør rettes.
Brugeren taster noget tekst ind i et tekstfelt (textbox), som så skal checkes vha. en customvalidator. Customvalidatoren skal IKKE udføre checket vha. et check på serveren, men derimod vha. et javascriptcheck ved klienten (javascriptet står så i html-delen af aspx-siden). Checket (som står i mit oprindelige spørgsmål) står sidst inde i <head>-delen. Altså: <head> . . . kode fra spørgsmålet </head>
Aspx-delen består kun af 1 formelement. Sidst i dette element står koden:
Men når kildefilerne kompileres til DLL-filer, så bliver alt nødvendigt da inkluderet i DLL-filen, gør det ikke? Når kildefilerne ER kompileret, så taler man da ikke om desideret objektkald, så nogle bestemte filer(som benyttes implicit) skal være tilstede?
:) desværre... for at lette presset på serveren har MS valgt at lægge disse to .js filer ud som seperate filer, istedet for at lave en handler generere dem. På den måde kan man også udnytte det at browseren er i stand til at cache .js filer, hvilket man ellers ikke kunne udnytte.
Så, det korte og det lange er... prøv nu bare at læg den mappe op på serveren og se hvad der sker !!
Jeg tror, at jeg har fundet en fejl nu. Hvis jeg laver en "alert" som det første i scriptfunktionen, så kommer den fin frem. Hvis jeg laver en "alert("arguments= "+arguments.value);", så skriver den "arguments= undefined". Hvis jeg skriver "alert("arguments= "+arguments.value.length);", så popper boxen overhovedet ikke op. Så der må være en fejl i argumenterne. Hvad kan det være?
I dette eksempel står der også runat="server". Samtidig står der: ClientValidationFunction="alreadyInUse_Validate". Betyder det, at hvis der er skrevet et servercheck, så bliver det checket på serveren som følge af runat="server"? Og at hvis der så er skrevet en javascriptfunktion, så bliver den checket af clienten som følge af ClientValidationFunction="alreadyInUse_Validate" ?
jeg vil tro at hvis browseren er en såkaldt UpLevel browser vil ClientValidation blive brugt, mens at en DownLevel browser ikke vil benytte sig af client-side validation. Sådan fungerer de normale Validator-kontroller i hvert fald.
din egen kode benytter sig også af en Serverkontrol (runat="server"), så jeg kan ikke se den store forskel mellem det eksempel jeg kom med, og så din kode... bortset fra det ene virker, og dit åbenbart ikke gør.
Både min kode og din kode bruger Serverkontrol og clientkontrol. Så der er ikke nogen forskel. Det var nu heller ikke forskellen, jeg spurgte til. Jeg spurgte til, om hvilken effekt de 2 kontroller har, samt om man skal (/kan) angive begge kontrolmetoder samme sted.
det at man har brugt etn asp:CustomValidator, gør at man i alle tilfælde skal implementere validerings-funktionen selv.
En validator består typisk af både klient-kode og server-kode, og ved en CustomValidator skal man altså selv lave begge former for kode. Men det har du jo fint fat i.
grunden til at det skal være en server-kontrol (asp: og runat="server") er for at kunne tilføje validatoren til control-hireakiet så man kan gøre f.eks. Page.IsValid og Page.Validate(). Dernæst tjekker asp.net hvilken browsertype der requester-siden og enabler det clientscript man har defineret alt efter hvilket browser man har.
Faktisk ser din kode ud til at virke fint nok som du kan se ved at prøve det andet link.
Ved at lave en viewsource kan du forresten se hvorfor den aspnet_client-mappe er så vigtigt, der kommer nemlig denne linje med når client-side validation bliver brugt:
Men det er da mærkeligt, at det tilsyneladende fungerer på din server, når det ikke fungerer på min server...selvom det fungerer lokalt ved mig. Har du manuelt lagt den mappe op på serveren ? Og hvor finder man den mappe henne af?
Desuden står der noget javascript EFTER det felt, som man gerne vil have valideret. Er det noget kode, som man selv skal sætte ind, eller bliver det genereret automatisk af compileren?
tja... du kuuuunne jo prøve at kigge i din egen wwwroot-mappe. Ja, det er som oftest en mappe man selv skal lægge op. Alt det ekstra javascript der er kommet når man ser den rendererede html er noget der automatisk er blevet genereret for at få validator-frameworket til at fungere.
Så har jeg fået det til at virke. Det skal være usagt, om det med clientmappen egentlig har noget, at skulle have sagt. Men nu har jeg sat <!-- og --> tilbage, samt lavet et enkelt mellemrum mellem "," og "args" i argumentfeltet. Desuden har jeg navngivet argumentet til "args" i stedet for "arguments", og "value" har jeg skrevet med stort "v". Og nu virker det. Så hvis du lige vil lægge et svar, fessor?
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.