Avatar billede mema Nybegynder
15. februar 2007 - 16:27 Der er 17 kommentarer og
1 løsning

Dropdownlist og Cache

I en bestillingsformular sender jeg indtastede data per e-mail. Bestillingsformularen kan udfyldes flere gange i samme session. Det kører fint vha. Sessrion State og ArrayList. Hver gang man udfylder den vises der en oversigt over bestilling/bestillinger man har udfyldt. Til sidst går man til personlige oplysninger.

Mit problem er, at der ikke skal vælges forskellinge ting i en dropdownlist, når man udfylder flere gange.

Jeg har brugt Cache for at løse problemet. Men det er ikke lykkedes helt:

På oversigt siden i Page_Load har jeg sat:
private void Page_Load(object sender, System.EventArgs e)
{
.....
.....
Response.CacheControl = "no-cache";
if (Cache.Get("brugstring")!= null)
{
listBrug.SelectedItem.Text = Cache.Get("brugstring").ToString();
listBrug.Enabled = false;
txtOplag.BackColor = Color.LightGray;
RequiredFieldValidator6.Enabled = false;
}

Og på selve formularen har jeg sat:
private void Page_Load(object sender, System.EventArgs e)
{
Cache.Insert("brugstring", item.BrugString);
.....
Cache.Remove("brugstring");
Response.Redirect("SendBestilling.aspx");
.....

Jeg får følgende fejl:
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.FormatException: Input string was not in a correct format.
Avatar billede mema Nybegynder
15. februar 2007 - 16:30 #1
Undskyld. Glemt at nævne:

Cache.Remove("brugstring");
Response.Redirect("SendBestilling.aspx");

sættes ind under button-control, der ligger på oversigtsiden og fører til personlige oplysninger, dvs. når man forlader oversigt og formular siderne.
Avatar billede kalp Novice
15. februar 2007 - 16:35 #2
er det ikke her den er galt?
Cache.Insert("brugstring", item.BrugString);
eller hvad er item.BrugString ?
Avatar billede dr_chaos Nybegynder
15. februar 2007 - 16:51 #3
brug
Cache.["brugstring"] = item.BrugString;
og
Cache.["brugstring"] = null;
Avatar billede mema Nybegynder
15. februar 2007 - 22:29 #4
I stedet for hvad skal bruges: Cache.["brugstring"] = item.BrugString;
og i stedet for hvad denne: Cache.["brugstring"] = null;
Avatar billede dr_chaos Nybegynder
16. februar 2007 - 09:44 #5
Cache.Insert("brugstring", item.BrugString);
erstattes med:
Cache["brugstring"] = item.BrugString;

og
Cache.Remove("brugstring");
erstattes med
Cache["brugstring"] = null;
Avatar billede mema Nybegynder
16. februar 2007 - 11:44 #6
Nu virker det kun for først gang, da Cache er tømt. Når jeg kommer fra oversigtssiden til formularen igen viser den også den som er i Cache'en og er valgt. Men fra nu af går det galt, hvis jeg trykke igen på knappen, der kommer til oversigtssiden!

Jeg har kigget på dropdownlisten indhold efter den først gang og nu står her i stedet for:
-- Vælg --
item 1
item 2

sådan her:
item 1
item 1
item 2

Indeforstået, at jeg havde valgt "item 1" den først gang på formularen.
Her er ændrede koden igen:

Oversigtssiden:
---------------
ArrayList cart = (ArrayList)Session["Cart"];
.....
lblSessionCount.Text = cart.Count.ToString();
if (Convert.ToDouble(lblSessionCount.Text) > 0)
{
Cache["brugstring"] = item.BrugString;
}

og nederst på kanp-controllen til personlige oplysninger:
Cache["brugstring"] = null;
Response.Redirect("SendBestilling.aspx");

og i Formularen (Page_Load):
--------------
ArrayList cart = (ArrayList)Session["Cart"];
lblSessionCount.Text = cart.Count.ToString();
if (Convert.ToDouble(lblSessionCount.Text) > 0)
{
listBrug.SelectedItem.Text = Cache["brugstring"].ToString();
}
Avatar billede mema Nybegynder
16. februar 2007 - 11:48 #7
Har glemt at skrive at fejlen er, at RequiredFieldValidator viser sig og spærrer for at siden skifter til oversigtssiden, som om man ikke har valgt noget for dropdown-listen.
Avatar billede dr_chaos Nybegynder
16. februar 2007 - 12:50 #8
Det tyder på at den har tilføjet det samme item 2 gange til din session.
Avatar billede mema Nybegynder
16. februar 2007 - 13:24 #9
Jeg troede, at Session og Caching her har sit deres liv adskilt.
Det er jo meningen, at item i dropdown ikke ændres og overføres til næste loading af formularen.

i linien:
Cache["brugstring"] = item.BrugString; er "BrugString" en Property, der findes som en item i ArrayList, som styres af dropdownlisten. Bortset fra den første item, der hedder "-- Vælg --", har "item 1" og "item 2" en tekst value (Text) og en Value (Double), der går i beregningen. Så måske er det ikke rigtig at bruge "item.BrugString" som en værdi for Cache'en "brugstring"?
Avatar billede dr_chaos Nybegynder
16. februar 2007 - 13:44 #10
Du skal bare lave et tjek på om det findes i listen i forvejen.
Cache er generelt for hele applikationen.
Session er for den enkelte bruger.
Avatar billede mema Nybegynder
16. februar 2007 - 14:12 #11
Efter at man for første gang går fra oversigssiden til formularen kan jeg se (vha. en tjekCache program), at "brugstring"'s value er gemt i Cachen.

Du skriver,at jeg skal tjekke om der allerede findes i forvejen en Cache for den valgte item i dropdown. Kan jeg bede om precisser hvor du mener det skal indsættes: i formularen eller oversigtssiden og hvordan skal den se ud fx:

if (Cache["brugstring"] != null)

Men er det ikke en dobblettjek. I linien:
if (Convert.ToDouble(lblSessionCount.Text) > 0)
.....
tjekker man allerede, om man på anden gang er landet i formularen, fordi der er sat validering for formular-felterne, og det kan ikke submittes uden at de er valgt/udfyldt i første omgang.
Avatar billede dr_chaos Nybegynder
16. februar 2007 - 18:21 #12
Det jeg mener er at du skal tjekke om værdien af cache ligger i din dropdownliste.
Avatar billede mema Nybegynder
17. februar 2007 - 22:39 #13
Ja tak. Det virker nu:

if (Cache["brugstring"].Equals("item 1"))
{
listBrug.SelectedIndex = 1;
listBrug.Enabled = false;
}
if (Cache["brugstring"].Equals("item 2"))
{
listBrug.SelectedIndex = 2;
listBrug.Enabled = false;
}

Send venligst et svar :-)
Avatar billede dr_chaos Nybegynder
17. februar 2007 - 22:51 #14
svar.
Du skal bare huske at en cache værdi gælder for alle brugere på siden.
Hvis værdien skal være specifik for en bruger bør du overveje at benytte session.
Avatar billede mema Nybegynder
18. februar 2007 - 19:21 #15
Betyder det, at hvis der samtidig 5 forskellige personer udfylder skemaet kan der være at ens browser viser de Cache-værdier, som en anden bruger har kørt før indsat!?

hvis dette er tilfælde, kan jeg bare skifte ordet: "Cache" med "Session"? Jeg har prøvet dette og det ser ud, som om dette også virker?
Avatar billede dr_chaos Nybegynder
18. februar 2007 - 20:13 #16
ja session er til den enkelte bruger.
Cache er til noget som alle brugere har adgang til.
Avatar billede mema Nybegynder
18. februar 2007 - 20:19 #17
Mange tak for hjælpen :-)
Avatar billede dr_chaos Nybegynder
19. februar 2007 - 16:37 #18
np :)
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