Avatar billede cogitans Nybegynder
30. marts 2005 - 09:43 Der 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:

function check(source,arguments)
{
<!--
    if(arguments.Value.length<3)
    {
    //alert("falsk1");
        arguments.IsValid = false; 
    }else
    if(arguments.Value.length>6)
    {
    //alert("falsk2");
        arguments.IsValid = false; 
    }else
    {
    //alert("sand");
        arguments.IsValid = true;
    }
}
-->
</script>

og scriptet kaldes således:
....ClientValidationFunction="check"....

ps: hvis jeg ikke udkommenterer alert-funktionerne, så bliver disse altså heller ikke kaldt...
Avatar billede skyggen2000 Nybegynder
30. marts 2005 - 10:20 #1
Køres det server eller client side?

Hvis det køres client side, burde der ikke være nogen forskel. Er du sikker på du kalder funktionen på samme måde når du har lagt den på serveren?
Avatar billede skyggen2000 Nybegynder
30. marts 2005 - 10:22 #2
hvorfor har du dem her <!--  --> rundt om kun noget af din kode?
Avatar billede cogitans Nybegynder
30. marts 2005 - 14:35 #3
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?
Avatar billede skyggen2000 Nybegynder
30. marts 2005 - 14:45 #4
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.
Avatar billede olebole Juniormester
30. marts 2005 - 15:41 #5
<ole>

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.

/mvh
</bole>
Avatar billede cogitans Nybegynder
30. marts 2005 - 16:04 #6
Kaldet fungerer da ellers fint nok lokalt. Koden ser således ud:

<asp:customvalidator id="txtValidator" runat="server" Width="88px" Height="8px" ErrorMessage="Den gik ikke!" ControlToValidate="txtMellemTegn" ClientValidationFunction="check">
Avatar billede burningice Nybegynder
30. marts 2005 - 18:39 #7
uhm... nu er det vel ikke noget at asp_client-mappen ikke findes på serveren?
Avatar billede cogitans Nybegynder
30. marts 2005 - 20:14 #8
?
Hvad er det for en mappe? Og skal den ligge på serveren (hvorfor?)?
Avatar billede burningice Nybegynder
30. marts 2005 - 20:25 #9
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.
Avatar billede olebole Juniormester
30. marts 2005 - 20:29 #10
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.
Avatar billede cogitans Nybegynder
30. marts 2005 - 20:41 #11
okay. Hvordan kalder jeg så scriptet vha. javascript?
Avatar billede olebole Juniormester
30. marts 2005 - 20:47 #12
Det kommer anpå resten af din kode - og hvornår/hvordan du ønsker det kaldt
Avatar billede cogitans Nybegynder
30. marts 2005 - 21:03 #13
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:
Avatar billede cogitans Nybegynder
30. marts 2005 - 21:06 #14
<tr>
  <td><asp:textbox id="txtMellemTegn" runat="server" Width="200px"></asp:textbox></td>
</tr>
<tr>
  <td><asp:customvalidator id="txtValidator" runat="server" Width="88px" Height="8px" ErrorMessage="Den gik ikke!" ControlToValidate="txtMellemTegn" ClientValidationFunction="check" EnableClientScript="true">
</tr>
Avatar billede burningice Nybegynder
30. marts 2005 - 21:57 #15
har du tjekket om mappen findes på dit websted?
Avatar billede cogitans Nybegynder
30. marts 2005 - 22:02 #16
Mappen "aspnet_client" findes ikke på serveren. Skal den det, for at klienten kan køre javascript fra sitet?
Avatar billede burningice Nybegynder
30. marts 2005 - 22:13 #17
det tror jeg faktis, da hele Validator-frameworket er afhængig af webuivalidation.js, som ligger undder aspnet_client.
Avatar billede cogitans Nybegynder
30. marts 2005 - 22:27 #18
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?
Avatar billede burningice Nybegynder
30. marts 2005 - 22:51 #19
:) 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 !!
Avatar billede cogitans Nybegynder
30. marts 2005 - 23:15 #20
:-)
Ja, klart da. Det prøver jeg lige som det første i morgen.
Avatar billede cogitans Nybegynder
31. marts 2005 - 09:42 #21
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?
Avatar billede burningice Nybegynder
31. marts 2005 - 11:42 #22
Her er et eksempel jeg fandt inde på CodeProject.

<%@ Page language="c#" Codebehind="anvcustom.aspx.cs" AutoEventWireup="false" Inherits="InteractiveAspNet.anvcustom" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
    <HEAD>
        <title>ASP.NET Validation - CustomValidator demo</title>
        <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0">
        <meta name="CODE_LANGUAGE" Content="C#">
        <meta name="vs_defaultClientScript" content="JavaScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
        <script lang="javascript">
            function alreadyInUse_Validate (source, args)
            {
                // Default Value
                args.IsValid = true;

                // Simulating a check against a database
                if (args.Value == "pdriley@santt.com" || args.Value == "paul.riley@santt.com")
                    args.IsValid = false;
            }
        </script>
    </HEAD>
    <body MS_POSITIONING="GridLayout">
        <form id="anvcustom" method="post" runat="server">
            <asp:TextBox id="nameBox" style="Z-INDEX: 103; LEFT: 102px; POSITION: absolute; TOP: 14px" runat="server" Width="239px"></asp:TextBox>
            <asp:Label id="instructionLabel" style="Z-INDEX: 101; LEFT: 17px; POSITION: absolute; TOP: 17px" runat="server" Width="85px">Enter Email:</asp:Label>
            <asp:Button id="submitButton" style="Z-INDEX: 102; LEFT: 200px; POSITION: absolute; TOP: 48px" runat="server" Width="131px" Text="Submit"></asp:Button>
            <asp:CustomValidator id="alreadyInUse" style="Z-INDEX: 104; LEFT: 30px; POSITION: absolute; TOP: 49px" runat="server" Width="162px" ControlToValidate="nameBox" ErrorMessage="Email already in use" ClientValidationFunction="alreadyInUse_Validate"></asp:CustomValidator>
        </form>
    </body>
</HTML>
Avatar billede cogitans Nybegynder
31. marts 2005 - 13:00 #23
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" ?
Avatar billede burningice Nybegynder
31. marts 2005 - 13:33 #24
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.
Avatar billede burningice Nybegynder
31. marts 2005 - 13:34 #25
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.
Avatar billede cogitans Nybegynder
31. marts 2005 - 15:57 #26
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.
Avatar billede burningice Nybegynder
31. marts 2005 - 17:04 #27
altså

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.

Jeg har lagt ovenstående eksempel ud her: http://burningice.dk/eksperten.dk/604777/Default.aspx

og dit eksempel her: http://burningice.dk/eksperten.dk/604777/cogitans.aspx

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:

<script language="javascript" type="text/javascript" src="/aspnet_client/system_web/1_1_4322/WebUIValidation.js"></script>
Avatar billede cogitans Nybegynder
31. marts 2005 - 19:05 #28
Ja, det har du da ret i :-)

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?

Koden er:
<script language="javascript" type="text/javascript" src="/aspnet_client/system_web/1_1_4322/WebUIValidation.js"></script>


            <input name="nameBox" type="text" value="aeee" id="nameBox" style="width:239px;Z-INDEX: 103; LEFT: 102px; POSITION: absolute; TOP: 14px" />
            <span id="instructionLabel" style="width:85px;Z-INDEX: 101; LEFT: 17px; POSITION: absolute; TOP: 17px">Enter Email:</span>
            <input type="submit" name="submitButton" value="Submit" onclick="if (typeof(Page_ClientValidate) == 'function') Page_ClientValidate(); " language="javascript" id="submitButton" style="width:131px;Z-INDEX: 102; LEFT: 200px; POSITION: absolute; TOP: 48px" />
            <span id="alreadyInUse" controltovalidate="nameBox" errormessage="Email already in use" evaluationfunction="CustomValidatorEvaluateIsValid" clientvalidationfunction="alreadyInUse_Validate" style="color:Red;width:162px;Z-INDEX:104;LEFT:30px;POSITION:absolute;TOP:49px;visibility:hidden;">Email already in use</span>
       
<script language="javascript" type="text/javascript">
<!--
    var Page_Validators =  new Array(document.all["alreadyInUse"]);
        // -->
</script>

           
<script language="javascript" type="text/javascript">
<!--
var Page_ValidationActive = false;
if (typeof(clientInformation) != "undefined" && clientInformation.appName.indexOf("Explorer") != -1) {
    if ((typeof(Page_ValidationVer) != "undefined") && (Page_ValidationVer == "125"))
        ValidatorOnLoad();
}

function ValidatorOnSubmit() {
    if (Page_ValidationActive) {
        return ValidatorCommonOnSubmit();
    }
    return true;
}
// -->
</script>
Avatar billede burningice Nybegynder
31. marts 2005 - 19:48 #29
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.
Avatar billede cogitans Nybegynder
02. april 2005 - 09:08 #30
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?
Avatar billede burningice Nybegynder
02. april 2005 - 09:40 #31
det var da godt det virker nu
Avatar billede cogitans Nybegynder
02. april 2005 - 09:44 #32
ja, neeeemlig ja!
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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