23. oktober 2004 - 00:31Der er
20 kommentarer og 1 løsning
Session og postback problem
Hej
Jeg sidder og roder lidt med asp.net og har nu fået en mindre problem i forbindelse med en tilmeldingsfunktion.
På side 1 udfylder brugeren lidt info om sig selv. De indtastede værdier gemmes i et Deltager objekt. Når der trykkes på videre gemmer jeg deltager objektet i Session["deltager"], og brugeren kommer til side 2, hvor de netop indtastede informationer bliver vist så de kan bekræftes. Her går det fint med at hente oplysningerne på denne måde
if (Session["deltager"] != null){ d = (Deltager)Session["deltager"]; lbl_navn.Text = d.Navn; lbl_adresse.Text = d.Adresse; lbl_email.Text = d.Email; }
Det går også fint nok på side 2. Men når brugeren så trykker videre herfra vil jeg så lige vise en besked om at mail er sendt osv, men her går det galt. Når jeg på side 3 forsøger at hente Session["deltager"] så er der ikke nogen. Session.count er 0.
Jeg er nået frem til, at det vist går galt ved den automatiske postback der laves på side 2 når der trykkes på knappen. Men det burde vel ikke fjerne en Session??
Er der nogen der har et ide til hvordan jeg løser det problem? Hvis I skal se noget mere kode må I lige sige til.
jeg vil meget gerne se noget kode... jeg vil gerne se koden på side 3... altså den hvor du konstaterer at Session["deltager"] == null Også gerne page_load og klik-handleren på side 2. mvh
session-varible kan smutte under forskellige omstændigheder, men at du ligefrem kan fremtvinge det efter et par klik er udædvanligt.... (det er ikke sådan at du ændrer i filer eller noget lige inden du går til side 3 vel ?). mvh
Side 1 når brugeren trykker videre private void submit_Click(object sender, System.EventArgs e) { HentIndtastetInfo(); Session["deltager"] = d; //Session.Add("deltager",d); Server.Transfer("index.aspx?valg=kvittering"); }
Her finder jeg Session på side 2 if (Session["deltager"] != null){ d = (Deltager)Session["deltager"]; lbl_navn.Text = d.Navn; lbl_adresse.Text = d.Adresse; lbl_email.Text = d.Email; } else { lbl_navn.Text = "Der er sket en fejl i behandlingen af din tilmelding."; } Og når der trykkes på bekræft på side 2 sker dette
Jeg har i denne button click også forsøgt at sende mailen med det samme ved at hente email adressen fra objektet deltager (efter at have hentet det fra Session) men allerede der er det væk. Men koden til side 3 kommer lige alligevel her
hej frydenholm og undskyld ventetiden (synes egentlig jeg havde skrevet noget tilbage til dig - men det havde jeg så ikke).... er der nogen bestemt årsag til at du laver en Server.Transfer(...) ?
Hej Snepnet Næh, der er ikke nogen synderlig god grund til at jeg bruger Server.Transfer - jeg kan vel egentlig lige så godt lave en redirect - tror bare jeg så det i et eksempel og har så brugt det.
Den kode du spørger om kører i pageload, men jeg tror egentlig problemet opstår før det. Fordi som jeg skrev (måske lidt uklart formuleret) så har jeg på side 2 forsøgt at sende en mail i stedet for at lave en Server.transfer(....)
Dvs at det er efter postback på side 2 at min Session er død (så vidt jeg lige kan se).
Den kan ikke finde Session deltager, så jeg har ikke noget objekt at tage email adressen fra.
Så for at lige opsummere min lidt uklare formuleringer så er mit problem følgende: Fra side et gemmer jeg en Deltager i en Session. Den henter jeg ud på side 2 i page_load og det går fint. Men når jeg så trykker på en knap på side 2, så er min Session væk, så jeg ikke kan hente min Deltager ud igen. Jeg har så forsøgt at komme videre til en side 3, men der er problemet jo allerede opstået, så det må være før det der sker noget underligt.
HentIndtastetInfo() henter værdier fra de indtastede felter på siden og de respektive attributter på Deltager sættes også i den metode.
Jo, jeg ved godt at resten af metoden ikke bliver kørt efter Server.Transfer(...). Jeg kan se at jeg har sådan en linie stående i den kode jeg har klippet ind - lige før jeg forsøger at sende en mail. Men i programmet er den kommenteret ud - det er fordi jeg har forsøgt mig lidt frem og tilbage med forskellige ting. :-)
Men tilbage til det jeg egentlig skulle svare på - Ja, de har de rigtige informationer på side 1 når jeg gemmer Deltager d i min Session. Og i page_load på side 2 går det jo også fint med at hente informationerne fra Session. Det er først efter en post_back på side 2 at Session er død.
Jeg overvejer at lave et forsøg hvor jeg laver nøjagtig det samme med webforms i stedet for usercontrols - for at se om det gør en forskel. Af andre ting jeg har tænkt på (men ikke lige haft tid til at rode med) er om det kan have noget med Server.Transfer at gøre - men det lyder umiddelbart ikke sandsynligt, da jeg jo bruger den metode fra side 1 til side 2, og der går det fint nok (første gang jeg henter fra Session altså). Eller kan det være en indstilling i webconfig eller noget i den dur? Der har jeg ikke pillet med noget selv - det er bare en standard config jeg bruger.
du kan prøve at tilgå din session på denne måde fra dine brugerkontroller :
HttpContext.Current.Session - og så vil jeg gerne se din page_load kode på side to.
(jeg skal lige se om jeg kan finde noget på det... jeg mener der har været en bug på et tidspunkt omkring forespørgsel på IsPostBack når man laver en Server.Transfer... men i det hele taget vil jeg foreslå en redirect med mindre du har behov for at tilgå noget på den side du laver en transfer fra).
Jeg har nu prøvet at tilgå min session med HttpContext....., og det hjalp ingenting.
Jeg har også prøvet at lave en Response.redirect i stedet for Server.Transfer, hvilket resulterede i, at jeg ikke kunne finde min Session overhovedet - heller ikke ved første page_load på side 2, som ellers virker fint med Server.Transfer.
Så nu kommer koden (ret kort til begge sider, da det "blot" er en lille prototype jeg roder rundt med).
Side 2 public class kvittering : System.Web.UI.UserControl { protected System.Web.UI.WebControls.Label lbl_navn; protected System.Web.UI.WebControls.Label lbl_adresse; protected System.Web.UI.WebControls.Label lbl_email; protected System.Web.UI.WebControls.Button Button1; protected Deltager d;
private void Page_Load(object sender, System.EventArgs e) { if (Session["deltager"] != null){ d = (Deltager)Session["deltager"]; lbl_navn.Text = d.Navn; lbl_adresse.Text = d.Adresse; lbl_email.Text = d.Email; } else { lbl_navn.Text = "Der er sket en fejl i behandlingen af dine data"; } } private void Button1_Click(object sender, System.EventArgs e) { try { d = (Deltager)HttpContext.Current.Session["deltager"]; MailMessage newMail = new MailMessage(); newMail.BodyFormat = MailFormat.Html; newMail.From = "test@Testesen.dk"; newMail.To = d.Email; newMail.Subject = "Test"; newMail.Body = "Hjælp...min Session er død"; SmtpMail.SmtpServer = "smtp.danhost.dk"; SmtpMail.Send(newMail); } catch (Exception ex) { Response.Write(ex.Message); } }
Jeg har svært ved at se hvad pokker der kan gå galt fra page_load til jeg trykker på knappen på side 2.
Da det er usercontrols der loades dynamisk (og som måske kan være årsag til det her (tror jeg)) kommer der lige et eksempel på hvordan jeg loader dem på index siden.
private void ExamineValg(){ Control c; valg = Request.QueryString["valg"]; switch (valg){ case "kvittering": c = Page.LoadControl("kvittering.ascx"); PlaceHolder.Controls.Add(c); break; case "tilmelding": c = Page.LoadControl("tilmelding.ascx"); PlaceHolder.Controls.Add(c); break;
Jeg håber du i ud fra denne kode kan få flere gode ideer til hvad jeg kan prøve. :-)
Det er som skrevet fra min index side hvor navigeringen styres.
Der ser koden således ud
public static string valg;
private void Page_Load(object sender, System.EventArgs e){ EnableViewState = true; ExamineValg(); } ExamineValg ser ud som vist tidligere - bortset fra at der er flere cases end de viste. Jeg ved ikke helt hvad du mener med "(hvilket event resulterer på et eller andet tidspunkt ....)"??
Min index side består af en menu lavet som usercontrol, og så en placeholder hvor jeg så ud fra en querystring loader usercontrols ind når det er nødvendigt. Kan det være noget af det der giver bøvl med Sessions?
Jeg er på vej ud og spise, så der går lidt tid før jeg svarer igen.
nu er du nok færdig med at spise *lolz* (undskyld jeg ikke har fået svaret).
jeg er midt i en masse huslige pligter.... hvad siger du til at smide en emailadresse her, så skriver jeg til dig og så kan du sende din testsolution tilbage - jeg er sikker på at det kan fikses meget enkelt, men det er 100 gange nemmere hvis jeg lige kan debugge igennem den selv.
jeg får fejl når jeg prøver at svare på din mail... jeg har prøvet at sende på den du skrev herude.
kan du ikke prøve at se hvorda det jeg har sendt til dig virker - og så skrive tilbage ? (jeg har lavet lidt nips i dit projekt... du kan jo se om det er noget du kan bruge til noget).
// tilmelding namespace Badminton { using System; using System.Data; using System.Drawing; using System.Web; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;
// kvittering namespace Badminton { using System; using System.Data; using System.Drawing; using System.Web; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Web.Mail;
/// <summary> /// Summary description for kvittering. /// </summary> public class kvittering : UserControlBase { protected System.Web.UI.WebControls.Label lbl_navn; protected System.Web.UI.WebControls.Label lbl_adresse; protected System.Web.UI.WebControls.Label lbl_email; protected System.Web.UI.WebControls.Button Button1;
private void Page_Load(object sender, System.EventArgs e) { if(SomeDeltager != null) { lbl_navn.Text = SomeDeltager.Navn; lbl_adresse.Text = SomeDeltager.Adresse; lbl_email.Text = SomeDeltager.Email; } else { lbl_navn.Text = "Der er sket en fejl i behandlingen af din tilmelding."; } }
// og index-siden using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls;
namespace Badminton { /// <summary> /// Summary description for index. /// </summary> public class index : System.Web.UI.Page { protected System.Web.UI.WebControls.PlaceHolder PlaceHolder;
Koden fra snepnet virker fint, men det fandt jeg først ud af, da jeg fik det uploadet til en webserver. Det virkede nemlig ikke lokalt, hvilket har vist sig at være min firewall der blokerer et eller andet. Jeg har ikke lige fundet en løsning på det.
Jeg bruger Zonealarm version 4.5 pro (jeg ved at der er/har været problemer med Zonealarm 5.0 og IIS, men har ikke hørt noget om version 4.5), og kan kun få mine sessions til at virke lokalt hvis jeg lukker min firewall.
Hvis der er nogen der har et løsning på det problem må I da gerne skrive den her :-) Så skal jeg nok efterfølgende oprette et spørgsmål med point til et evt. svar.
Synes godt om
Ny brugerNybegynder
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.