infostabil > edb.internet.* > edb.internet.webdesign.serverside.asp

Erik Ginnerskov (31.01.2007, 23:35)
Hej NG

Jeg har en side, hvor brugerne ved klik på links kan vælge mellem 3 mulige
sidelayouts. Dette script over DTD styrer det:

<%
style_ID = Request.QueryString("style")
dim style
Select Case style_ID
Case "../../hss-main.css", "ds2.css", "ds3.css"
style = style_ID
Case Else
style = "../../hss-main.css"
End Select
%>

Det fungerer for så vidt fint. Men skifter man til en anden side med samme
script-mulighed, skulle det valgte layout gerne fastholdes.

Jeg har kigget lidt på cookies i html.dk's lektion 13 i asp-tutorialen og
har prøvet at sætte noget sammen, men kan ikke få det til at virke:

<klip>
' Informationer hentes i cookien
strNavn = Request.Cookies("designskifte")("css")
strCss = Request.Cookies("designskifte")("css")
</klip>

.... indsat øverst i scriptet - tjek, om der er defineret design i en cookie.
___________

<klip>
' Informationer lagres i cookien
Response.Cookies("designskifte")("css") = "" ' noget info om designvariabel
' skal nok
indsættes her
' mellem " og "
Response.Cookies("designskifte").Expires = Date+30
</klip>

.... indsat nederst i scriptet - sæt eller opdater cookie.

Jeg får ikke nogen fejlmeldinger, det valgte design fastholdes bare ikke ved
sideskifte.
Erik Ginnerskov (01.02.2007, 00:28)
Erik Ginnerskov wrote:

> Jeg får ikke nogen fejlmeldinger, det valgte design fastholdes bare
> ikke ved sideskifte.


Jeg har arbejdet lidt videre med scriptet, men det fastholder stadig ikke
valgt layout:

<%
' Informationer hentes i cookien
strStyle = Request.Cookies("designskifte")("style")
style_ID = Request.QueryString("style")
dim style

Select Case style_ID
Case "../../hss-main.css", "ds2.css", "ds3.css"
style = style_ID
Case Else
style = "../../hss-main.css"
End Select
' Informationer lagres i cookien
Response.Cookies("designskifte")("style") = strStyle
Response.Cookies("designskifte").Expires = Date+30
%>
Jørn Andersen (01.02.2007, 03:34)
On Wed, 31 Jan 2007 23:28:18 +0100, "Erik Ginnerskov"
<erik> wrote:

[..]
>Select Case style_ID
> Case "../../hss-main.css", "ds2.css", "ds3.css"
> style = style_ID
> Case Else
> style = "../../hss-main.css"
>End Select
>' Informationer lagres i cookien
>Response.Cookies("designskifte")("style") = strStyle
>Response.Cookies("designskifte").Expires = Date+30
>%>


Er der forskel på style og strStyle?
Så vidt jeg kan se, har din Select Case ingen indvirkning på din
Cookie. Skal den ikke det?
Hint: Option Explicit er en god ven :)

Mvh. Jørn
Erik Ginnerskov (02.02.2007, 03:06)
Jørn Andersen wrote:

> Hint: Option Explicit er en god ven :)


Det prøvede jeg så:

<% Option Explicit %>
<%
' Informationer hentes i cookien
strStyle = Request.Cookies("designskifte")("style")

' her følger det fungerende script, der skifter sidelayout
style_ID = Request.QueryString("style")
dim style

Select Case style_ID
Case "../../hss-main.css", "ds2.css", "ds3.css"
style = style_ID
Case Else
style = "../../hss-main.css"
End Select
'her slutter layoutskiftescriptet

' Informationer lagres i cookien
Response.Cookies("designskifte")("style") = strStyle
Response.Cookies("designskifte").Expires = Date+30
%>

Så får jeg denne fejlmelidng:

Microsoft VBScript compilation error '800a0400'
Expected statement
xxx.inc, line 1
Option Explicit
^

Den forstår jeg ikke noget af. aspfaq.com snakker om inkompatible
asp-versioner, men hverken lokalt eller på nettet vil den æde kodelinje. Jeg
må prøve at se på en ommøblering. Måske det er fordi jeg - efter
sammenstykning ef enkeltkomponenter har dette:

<% Dim strTitle
strTitle="Test af alternativ css"%>

.... stående før sætningen med "Option Explicit"

> Er der forskel på style og strStyle?


Det var et trin i udviklingsfasen. Det fungerede ikke, når der ikke står
"str" foran i de to sætninger til cookie - men det gør det heller ikke med,
så ...

> Så vidt jeg kan se, har din Select Case ingen indvirkning på din
> Cookie. Skal den ikke det?


Jo, det var faktisk meningen, at det valg, der er gjort, skal noteres i
cookien. Men det hjælper ikke, at de sætninger, der skriver cookien, sættes
op før "End Select"?
Erik Ginnerskov (02.02.2007, 03:30)
Erik Ginnerskov wrote:

> Måske det er fordi
> jeg - efter sammenstykning ef enkeltkomponenter har dette:
> <% Dim strTitle
> strTitle="Test af alternativ css"%>
> ... stående før sætningen med "Option Explicit"


Ja, så langt så godt. En ommøblering fjernede fejlmeldingen, men
layoutvalget bliver stadig ikke fastholdt.
Jørn Andersen (02.02.2007, 03:45)
On Fri, 2 Feb 2007 02:06:13 +0100, "Erik Ginnerskov"
<erik> wrote:

>Jørn Andersen wrote:
>> Hint: Option Explicit er en god ven :)

>Det prøvede jeg så:
><% Option Explicit %> <snip>


[..]
> <% Dim strTitle
> strTitle="Test af alternativ css"%>
>... stående før sætningen med "Option Explicit"


Det lyder helt rigtigt. Dokumentationen siger:

If used, the Option Explicit statement must appear in a script before
any other statements.

Så den skal ikke stå i inkluderede filer, men i "hoved-filen".

>> Er der forskel på style og strStyle?

>Det var et trin i udviklingsfasen. Det fungerede ikke, når der ikke står
>"str" foran i de to sætninger til cookie - men det gør det heller ikke med,
>så ...


Jo, men du er nødt til at holde fast i dine variable. Hvis den skal
hedde strStyle, når du indsætter den, så skal den ikke hedde noget
andet, mens den bliver behandlet (i Select-valget).
Omdøb "style" til "strStyle".

>> Så vidt jeg kan se, har din Select Case ingen indvirkning på din
>> Cookie. Skal den ikke det?

>Jo, det var faktisk meningen, at det valg, der er gjort, skal noteres i
>cookien. Men det hjælper ikke, at de sætninger, der skriver cookien, sættes
>op før "End Select"?


Prøv at udskrive din strStyle, inden du indsætter i Cookien:
Response.Write strStyle
Response.End
- så har du styr på, hvad det er, du indsætter.

Hvis ikke du har det forventede dér, så ryk op og se, hvad du får fra
din QueryString.
Response.Write style_ID
Response.End

Good luck!
Erik Ginnerskov (04.02.2007, 02:21)
Jørn Andersen wrote:

> Prøv at udskrive din strStyle, inden du indsætter i Cookien:
> Response.Write strStyle
> Response.End


Øh, scriptet står før DTD på siden, så der kan da ikke sættes noget output
til browseren der - jeg får faktisk kun en blank side.

Men ved at kigge bag facaden i FF kan jeg se, at der faktisk bliver lavet en
cookie. Den har muligvis endda indhold, jeg forventer.

Min response.cookie ser nu sådan ud:

Response.Cookies("designskifte")("style") = style_ID

og indholdet i cookien ser f.eks. sådan ud:

style=ds3%2Ecss

.... hvor de tre alternativer er "?style=../hss-main.css", "?style=ds2.css"
og "?style=ds3.css"

Hvis det holder, skal jeg så bare have aflæst cookien ved sideskifte. I
øjeblikket ser min request.cookie sådan ud:

style = Request.Cookies("designskifte")("style")

Ved sideskifte springes tilbage til standarddesign - det er ikke meningen.
Jørn Andersen (04.02.2007, 06:43)
On Sun, 4 Feb 2007 01:21:49 +0100, "Erik Ginnerskov"
<erik> wrote:

>> Prøv at udskrive din strStyle, inden du indsætter i Cookien:
>> Response.Write strStyle
>> Response.End

>Øh, scriptet står før DTD på siden, så der kan da ikke sættes noget output
>til browseren der - jeg får faktisk kun en blank side.


Joda, det kan du sagtens.
De browsere jeg kender, vil vise den slags som ren tekst - prøv selv.

Mvh. Jørn
Erik Ginnerskov (05.02.2007, 09:16)
Jørn Andersen wrote:

>> Øh, scriptet står før DTD på siden, så der kan da ikke sættes noget
>> output til browseren der - jeg får faktisk kun en blank side.

> Joda, det kan du sagtens.
> De browsere jeg kender, vil vise den slags som ren tekst - prøv selv.


Både min Firefox 2.0 og min IE 7 viser en blank side. Men så prøvede jeg at
lave en test.asp:

<%
style_ID = Request.QueryString("style")
dim style

Select Case style_ID
Case "../../hss-main.css", "ds2.css", "ds3.css"
style = style_ID
Case Else
style = "../../hss-main.css"
End Select

dim QueryString
Response.Write style_ID
Response.end

' Informationer lagres i cookien
Response.Cookies("aspdesignskifte")("style") = style_ID
Response.Cookies("aspdesignskifte").Expires = Date+30
%>

Når jeg kalder test.asp med nogle parametre (eks. ?style=ds2.css), udskriver
den netop den info, jeg vil have lagret i cookien (ds2.css).

Nu skal jeg så have hentet info i cookien - hvis den da skal hentes:

Først undersøges, om brugeren vil ændre sidens design.

Hvis ikke, skal det tjekkes, om der i en cookie er lagret
information om et tidligere foretaget valg.

Derefter bliver eventuel style_ID (fra querystring eller cookie)
sammenlignet med de lovlige muligheder.

Er der ikke detekteret noget style_ID eller er der givet ulovligt
input, skal style sættes til standard.

Men hvordan det lige skal formuleres, kan jeg ikke overskue.
Erik Ginnerskov (07.02.2007, 16:01)
Erik Ginnerskov wrote:

> Nu skal jeg så have hentet info i cookien - hvis den da skal hentes:


Jeg har forsøgt at strikke noget sammen, der skulle kunne hente indholdet i
cookien, hvis ikke brugeren aktivt har bedt om et bestemt sidelayout:

<%
' Hent brugervalgt style-info hvis defineret
style_ID = Request.QueryString("style")
dim style

' Hvis intet brugervalgt style-info defineret
if style_ID = "" then

' Hent style-info fra cookie
style = Request.Cookies("designskifte")("style")
end if

Select Case style_ID
Case "../hss-main.css", "ds2.css", "ds3.css"
style = style_ID
Case Else
style = "../hss-main.css"
End Select

' style-info lagres i cookie
Response.Cookies("designskifte")("style") = style_ID
Response.Cookies("designskifte").Expires = Date+30
%>

Skiftet i sidelayoyt fungerer fint som selvstændig funktion, men hvis der
ikke er blevet bedt om et bestemt layout, bliver cookiens indhold ikke
hentet og brugt.
Jørn Andersen (07.02.2007, 16:32)
On Wed, 7 Feb 2007 15:01:04 +0100, "Erik Ginnerskov"
<erik> wrote:

>Jeg har forsøgt at strikke noget sammen, der skulle kunne hente indholdet i
>cookien, hvis ikke brugeren aktivt har bedt om et bestemt sidelayout:
> <%
> ' Hent brugervalgt style-info hvis defineret
> style_ID = Request.QueryString("style")
> dim style


Spørgsmålet er, hvad du får, når du ikke får noget ;-)
Prøv at udskrive værdien.
Formentlig vil du få en Empty-værdi.
Check evt. med:
Response.Write IsEmpty(style_ID)

Det kan du komme ud over ved at erstatte ovenstående med:
style_ID = Trim("" & Request.QueryString("style"))
- så vil den blive til en tom streng i stedet.

> ' Hvis intet brugervalgt style-info defineret
> if style_ID = "" then


Hvis værdien er Empty, så er den ikke lig "" - men det er den, hvis du
retter som foreslået.

>Skiftet i sidelayoyt fungerer fint som selvstændig funktion, men hvis der
>ikke er blevet bedt om et bestemt layout, bliver cookiens indhold ikke
>hentet og brugt.


Metoden til at løse den slags problemer er at bruge Response.Write på
sine variable - før If'en, inde i If'en og efter If'en. Så bliver det
hurtigt afsløret, hvad der sker undervejs.

Good luck!
Jens Gyldenkærne Clausen (07.02.2007, 16:39)
Erik Ginnerskov skrev:

> ' Hvis intet brugervalgt style-info defineret
> if style_ID = "" then
> ' Hent style-info fra cookie
> style = Request.Cookies("designskifte")("style")


Her har du hentet style-info fra din cookie.

> Select Case style_ID
> Case "../hss-main.css", "ds2.css", "ds3.css"
> style = style_ID
> Case Else
> style = "../hss-main.css"


- men her overskriver du den igen (Case Else fanger også de
tilfælde hvor der ikke er angivet style_ID).

Put din select-konstruktion ind i en ELSE-del til den øverste if-
sætning - så bliver din cookie-værdi ikke overskrevet.
Jørn Andersen (07.02.2007, 16:41)
On Mon, 5 Feb 2007 08:16:12 +0100, "Erik Ginnerskov"
<erik> wrote:

>Jørn Andersen wrote:
>>> Øh, scriptet står før DTD på siden, så der kan da ikke sættes noget
>>> output til browseren der - jeg får faktisk kun en blank side.

>> Joda, det kan du sagtens.
>> De browsere jeg kender, vil vise den slags som ren tekst - prøv selv.

>Både min Firefox 2.0 og min IE 7 viser en blank side.


Så er det nok fordi der ikke er noget indhold. For at være sikker, kan
du i stedet bruge:
Response.Write "strStyle: " & strStyle
- så vil der under alle omstændigheder stå "strStyle: "

Mvh. Jørn
Erik Ginnerskov (09.02.2007, 00:58)
Jørn Andersen wrote:

> Det kan du komme ud over ved at erstatte ovenstående med:
> style_ID = Trim("" & Request.QueryString("style"))


Så lykkedes det at få fastholdt det brugervalgte sidelayout ved skift af
side:

<%
' Hent brugervalgt style-info hvis defineret
style_ID = Trim("" & Request.QueryString("style"))
dim style

' Hvis intet brugervalgt style-info defineret
if style_ID = "" then

' Hent style-info fra cookie
style_ID = Request.Cookies("aspdesignskifte")("style")
end if

Select Case style_ID
Case "../hss-main.css", "ds2.css", "ds3.css"
style = style_ID
Case Else
style = "../hss-main.css"
End Select

' style-info lagres i cookie
Response.Cookies("aspdesignskifte")("style") = style_ID
Response.Cookies("aspdesignskifte").Expires = Date+30
%>

Jeg siger tak for sparringen.
Erik Ginnerskov (09.02.2007, 01:05)
Jens Gyldenkærne Clausen wrote:

>> ' Hvis intet brugervalgt style-info defineret
>> if style_ID = "" then
>> ' Hent style-info fra cookie
>> style = Request.Cookies("designskifte")("style")

> Her har du hentet style-info fra din cookie.


Ja, hvis der ikke er sket et brugervalg, skal en eventuel cookie aflæses.

>> Select Case style_ID
>> Case "../hss-main.css", "ds2.css", "ds3.css"
>> style = style_ID
>> Case Else
>> style = "../hss-main.css"

> - men her overskriver du den igen (Case Else fanger også de
> tilfælde hvor der ikke er angivet style_ID).


Nej, der bliver ikke overskrevet noget. Cookien bliver ikke læst, hvis
brugeren har foretaget et valg. Det var bare bagateller, der skulle
omformuleres.

> Put din select-konstruktion ind i en ELSE-del til den øverste if-
> sætning - så bliver din cookie-værdi ikke overskrevet.


Det vil muligvis også fungere - der er nok ikke behov for at validere input
fra cookien, det er allerede valideret, inden det blev lagt i cookien. Men
det fungerer nu, se mit svar til Jørn.

Lignende emner