Avatar billede frydenholm Nybegynder
23. oktober 2004 - 00:31 Der 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.
Avatar billede snepnet Nybegynder
23. oktober 2004 - 01:22 #1
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
Avatar billede snepnet Nybegynder
23. oktober 2004 - 01:27 #2
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
Avatar billede frydenholm Nybegynder
23. oktober 2004 - 11:02 #3
Her kommer så lige lidt kode

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

private void Button1_Click(object sender, System.EventArgs e) {
    Server.Transfer("index.aspx?valg=aktivitet");
}

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

if (Session["deltager"] != null){
  d = (Deltager)Session["deltager"];
  Label1.Text = d.Navn;
}
else {
    Label1.Text = "Ingen deltager session " + Session.Count;
    }

De sider jeg viser er lavet som usercontrols der loades dynamisk ind i en placeholder på index-siden. Jeg ved ikke om det kan have noget at sige.
Avatar billede snepnet Nybegynder
23. oktober 2004 - 17:42 #4
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(...) ?

og... hvor kører du denne kode :

if (Session["deltager"] != null){
  d = (Deltager)Session["deltager"];
  Label1.Text = d.Navn;
}
else {
    Label1.Text = "Ingen deltager session " + Session.Count;
    }

(er det i page_load eller ?)

mvh
Avatar billede frydenholm Nybegynder
23. oktober 2004 - 18:04 #5
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).

Koden jeg har forsøgt mig med på side 2:

private void Button1_Click(object sender, System.EventArgs e) {
    Server.Transfer("index.aspx?valg=aktivitet&ID="+Session.LCID);
    try {
        d = (Deltager)Session["deltager"];
            MailMessage newMail = new MailMessage();
        newMail.BodyFormat = MailFormat.Html;
        newMail.From = "test@mitdomæne.dk";
            newMail.To = d.Email;
        newMail.Subject = "Test";
            newMail.Body = "Så find da den session.....";
            SmtpMail.SmtpServer = "smtp.danhost.dk";
        SmtpMail.Send(newMail);
    }
    Catch (Exception ex) {
        Response.Write(ex.Message);
    }

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.
Avatar billede snepnet Nybegynder
23. oktober 2004 - 18:32 #6
hov...

Session["deltager"] = d;

har du stående her :

private void submit_Click(object sender, System.EventArgs e)
{
    HentIndtastetInfo();
    Session["deltager"] = d;
    Server.Transfer("index.aspx?valg=kvittering");
}

er du sikker på at d har den forventede værdi på det tidspunkt ?

(alt hvad du skriver i metoden efter Server.Transfer(...) vil ikke blive kørt - den er du med på ikke ?)

mvh
Avatar billede frydenholm Nybegynder
23. oktober 2004 - 18:44 #7
Hej igen

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.
Avatar billede snepnet Nybegynder
23. oktober 2004 - 18:51 #8
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).

mvh
Avatar billede frydenholm Nybegynder
23. oktober 2004 - 19:13 #9
Hej igen

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 1
public class tilmelding : 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.TextBox txt_navn;
        protected System.Web.UI.WebControls.TextBox txt_adresse;
        protected System.Web.UI.WebControls.TextBox txt_email;
        protected System.Web.UI.WebControls.Button submit;
        protected Deltager d;

    private void Page_Load(object sender, System.EventArgs e){
              d = new Deltager();
    }
    public void HentIndtastetInfo(){
        d.Navn = txt_navn.Text;
        d.Adresse = txt_adresse.Text;
        d.Email = txt_email.Text;
    }

    private void submit_Click(object sender, System.EventArgs e) {
        HentIndtastetInfo();
        HttpContext.Current.Session["deltager"] = d;
        //Session.Add("deltager",d);
        //Response.Redirect("index.aspx?valg=kvittering");
        Server.Transfer("index.aspx?valg=kvittering");
          }
    }

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. :-)
Avatar billede snepnet Nybegynder
23. oktober 2004 - 19:26 #10
hov... i hvilket event kalder du denne kode metode ?
ExamineValg
eller rettere... resulterer på et eller andet tildspunkt i at metoden kaldes ?
Avatar billede snepnet Nybegynder
23. oktober 2004 - 19:28 #11
(hvilket event resulterer på et eller andet tidspunkt ....)
Avatar billede snepnet Nybegynder
23. oktober 2004 - 19:30 #12
og jeg vil også meget gerne se hvordan kaldet er "pakket ind"...
Avatar billede frydenholm Nybegynder
23. oktober 2004 - 19:53 #13
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.
Avatar billede snepnet Nybegynder
24. oktober 2004 - 12:03 #14
hej igen :o)

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.

hvad siger du til det ?

mvh
Avatar billede frydenholm Nybegynder
24. oktober 2004 - 17:43 #15
Det lyder som en helt fin ide.

Send til nfrydenholm@hotmail.com - så sender jeg min testsolution tilbage.
Avatar billede snepnet Nybegynder
24. oktober 2004 - 21:55 #16
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).

mvh
Avatar billede frydenholm Nybegynder
25. oktober 2004 - 18:48 #17
Jeg har prøvet den løsning du har sendt til mig, men kan ikke få det til at virke.
(Jeg har sendt en mail til dig)
Avatar billede snepnet Nybegynder
25. oktober 2004 - 18:50 #18
jeg har ikke fået den, men den dukker jo nok op :o)
mvh
Avatar billede snepnet Nybegynder
26. oktober 2004 - 20:21 #19
ok - lidt kode tilbage her :

// baseklasse for kontroller der skal kunne arbejde på sessionvariablen
using System;
using System.Web;

namespace Badminton
{
    public class UserControlBase : System.Web.UI.UserControl
    {
        protected Deltager SomeDeltager
        {
            get{return (object)HttpContext.Current.Session["DELTAGER"] != null ? (Deltager)HttpContext.Current.Session["DELTAGER"] : null;}
            set{Session["DELTAGER"] = value;}
        }
    }
}


// tilmelding
namespace Badminton
{
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;

    /// <summary>
    ///        Summary description for tilmelding.
    /// </summary>
    public class tilmelding : 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.TextBox txt_navn;
        protected System.Web.UI.WebControls.TextBox txt_adresse;
        protected System.Web.UI.WebControls.TextBox txt_email;
        protected System.Web.UI.WebControls.Button submit;

        private void Page_Load(object sender, System.EventArgs e)
        {
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {
            this.submit.Click += new System.EventHandler(this.submit_Click);
            this.Load += new System.EventHandler(this.Page_Load);
        }
       
        public void EnsureSesssionDeltager()
        {
            Deltager d = new Deltager();
            d.Navn = txt_navn.Text;
            d.Adresse = txt_adresse.Text;
            d.Email = txt_email.Text;   
            SomeDeltager = d;
        }

        private void submit_Click(object sender, System.EventArgs e)
        {
            EnsureSesssionDeltager();
            Response.Redirect("index.aspx?valg=kvittering");
        }
    }
}


// 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.";
            }
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {
            this.Button1.Click += new System.EventHandler(this.Button1_Click);
            this.Load += new System.EventHandler(this.Page_Load);
        }

        private void Button1_Click(object sender, System.EventArgs e)
        {       
            try
            {
                MailMessage newMail = new MailMessage();
                newMail.BodyFormat = MailFormat.Html;
                newMail.From = "test@Testesen.dk";
                newMail.To = SomeDeltager.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);
            }
       
        }
    }
}

// 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;
       
        protected string Valg
        {
            get{return (object)Request.QueryString["VALG"] != null ? Request.QueryString["VALG"] : null;}
        }
       
        private void Page_Load(object sender, System.EventArgs e)
        {
            ExamineValg();
        }
        private void ExamineValg()
        {
            Control c;
            switch (Valg){
                case "tilmelding":
                    c = Page.LoadControl("tilmelding.ascx");
                    PlaceHolder.Controls.Add(c);
                    break;
                case "kvittering":
                    c = Page.LoadControl("kvittering.ascx");
                    PlaceHolder.Controls.Add(c);
                    break;
                default:
                    c = Page.LoadControl("tilmelding.ascx");
                    PlaceHolder.Controls.Add(c);
                    break;                   
            }
        }

        override protected void OnInit(EventArgs e)
        {
            InitializeComponent();
            base.OnInit(e);
        }
       
        private void InitializeComponent()
        {   
            this.Load += new System.EventHandler(this.Page_Load);
        }
    }
}

mvh

[frydenhold smider en kommentart omkring lidt ballade med sessions og zonealarm, som tilsyneladende skaber problemerne]
Avatar billede snepnet Nybegynder
26. oktober 2004 - 20:21 #20
(og et svar :o)
mvh
Avatar billede frydenholm Nybegynder
26. oktober 2004 - 20:32 #21
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.
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