Avatar billede trumf Nybegynder
06. april 2005 - 16:22 Der er 11 kommentarer og
1 løsning

skrive til en sessionsvariabel

Hejsa E

Jeg har en dll hvorfra jeg henter nogle konstanter.
Nogle af disse skal hentes ud fra en sessions-værdi.
Hvus denne session ikke er sat skal den sættes men jeg får en fejl:
Object reference not set to an instance of an object

Line 810:    if (HttpContext.Current.Request.QueryString["lang"] == null)
Line 811:    {
Line 812:        HttpContext.Current.Session["lang"] = priLang.ToString();
Line 813:    }
Fejlen er linie 812
Avatar billede trumf Nybegynder
06. april 2005 - 16:34 #1
priLang er hentet fra en DB lige ovenfor
Avatar billede burningice Nybegynder
06. april 2005 - 16:45 #2
Request.QueryString["lang"] vil aldrig være null, men "" hvis at den angivne querystring ikke findes

if (HttpContext.Current.Request.QueryString["lang"] == String.Empty)
{
      HttpContext.Current.Session["lang"] = priLang.ToString();
}
Avatar billede burningice Nybegynder
06. april 2005 - 16:47 #3
men, det er nok ikke det der er problemet i dit tilfælde, da du jo rent faktisk kommer ind i if-sætningen

istedet må det være enten priLang der er null, eller også udføres koden uden for en context der gør at session ikke er tilgængelig
Avatar billede trumf Nybegynder
06. april 2005 - 16:49 #4
nu er lang jo det sprog som applikationen skal køre, så det er vigtigt at den er sat på alle sider... så måske jeg skulle sætte den inden jeg kalder dll'en, f.eks. lægge den i en anden klasse.
Hvad er kotume her ?
Avatar billede trumf Nybegynder
06. april 2005 - 17:10 #5
Nu har jeg lavet en funktion som kan kaldes fra alle sider:
        private void SetLang()
        {
            if (HttpContext.Current.Request.QueryString["lang"] == String.Empty)
            {
                if (HttpContext.Current.Session["lang"] == String.Empty)
                {
                    string webID = Convert.ToString(Functions.GetWebID());
                    string SQLStr = "SELECT * FROM admin WHERE webID = " + webID.ToString();
                    MySqlConnection MySConn = new MySqlConnection(Functions.GetSConnStr().ToString());
                    MySqlCommand cmd = new MySqlCommand(SQLStr, MySConn);
                    MySConn.Open();
                    MySqlDataReader reader = cmd.ExecuteReader();
                    reader.Read();
                    string priLang = reader["priLang"].ToString();
                    reader.Close();
                    MySConn.Close();
                    HttpContext.Current.Session["lang"] = priLang;
                }
            }
            else
            {
                HttpContext.Current.Session["lang"] = HttpContext.Current.Request.QueryString["lang"].ToString())
            }
        }

Det ligner måske overkill men så er jeg da sikker på at den hele tiden er sat.
Er det "pæn" kode eller skal det gøres på en anden måde ?
Avatar billede burningice Nybegynder
06. april 2005 - 17:34 #6
en anden mulighed er at sætte Session["lang"] i din global.asax ved hvert request. Der er en Begin_Request-metode som bliver udført hver gang at der laves en request. Her kan du passende sætte din session-variabel, uden at skulle tænke på at gøre det på selve dine sider
Avatar billede trumf Nybegynder
06. april 2005 - 17:37 #7
klart....
Man bliver jo helt kodeblind af alt det her klasse mig her og klasse mig der....

Skal den ligge i Application_BeginRequest ?
Avatar billede burningice Nybegynder
06. april 2005 - 17:43 #8
yearh, thats the one
Avatar billede trumf Nybegynder
06. april 2005 - 17:59 #9
Nu ser det såda ud:

        protected void Application_BeginRequest(Object sender, EventArgs e)
        {
            if (Request.QueryString["lang"] == String.Empty)
            {
                if (Session["lang"] == null)
                {
                    string webID = Convert.ToString(Functions.GetWebID());
                    string SQLStr = "SELECT * FROM admin WHERE webID = " + webID.ToString();
                    MySqlConnection MySConn = new MySqlConnection(Functions.GetSConnStr().ToString());
                    MySqlCommand cmd = new MySqlCommand(SQLStr, MySConn);
                    MySConn.Open();
                    MySqlDataReader reader = cmd.ExecuteReader();
                    reader.Read();
                    string priLang = reader["priLang"].ToString();
                    reader.Close();
                    MySConn.Close();
                    Session["lang"] = priLang;
                }
            }
            else
            {
                Session["lang"] = Request.QueryString["lang"].ToString();
            }

        }

men der kommer en fejl:
System.Web.HttpException: Session state is not available in this context.

Hvis jeg lader "HttpContext.Current" stå foran får jeg fejlen:
System.NullReferenceException: Object reference not set to an instance of an object
HttpContext.Current.Session["lang"] = HttpContext.Current.Request.QueryString["lang"];
Avatar billede burningice Nybegynder
06. april 2005 - 18:21 #10
aaarh... hvorfor skal det være så besværligt ;)... nå, så er der åbenbart ikke adgang til session på det stadie.

prøv den her istedet

Application_PreRequestHandlerExecute:

This event occurs just before ASP.Net begins executing a handler such as a page or a web service. At this point, the session state is available.
Avatar billede trumf Nybegynder
07. april 2005 - 14:45 #11
Undskyld jeg har været så lang tid om det, men der kom lige noget op...

Dit sidste forslag fejlede ikke, men kalder singeltonen for sent, så jeg har gjort det lidt anderledes, men din ide med at det skulle i global.asax var det der gjorde udslaget, så du giver bare et svar.

Takker for din tid :)
Avatar billede burningice Nybegynder
07. april 2005 - 17:08 #12
:) 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