none
Cookie setzen beim Seitenstart RRS feed

  • Frage

  • Hallo

    ich möchte gerne beim Start der Seite einen Cookie erzeugen mit einem Wert aus einem Querystring oder aus einem Textfeld. Anhand dieses Cookies soll dann die entsprechende Sprache ausgewählt werden allerdings ohne erst ein Click-Event abzuschicken.

     Protected Sub Page_Init(sender As Object, e As EventArgs) Handles Me.Init
            Dim cult As String = Me.hdlang.Text
            Dim cookie As New HttpCookie("cult")
            cookie.Value = cult
            Response.SetCookie(cookie)
        End Sub

    Ich habe es im Load Event und auch im preLoad event gesetzt. Dann noch folgendes probiert

    Protected Sub ReadCookie()
            Dim strCookieName As String = "cult"
    
            Dim cookie As HttpCookie = Request.Cookies(strCookieName)
    
            If cookie Is Nothing Then
                lblcult.Text = "gibts nicht"
            Else 'Write the cookie value
                Dim strCookieValue As String = Me.hdlang.Text
                lblcult.Text = strCookieName & " cookie enthält: " & strCookieValue
            End If
        End Sub
        
        ' --- Page load
         If Me.hdlang IsNot Nothing Then
                        ReadCookie()
         End If

    Gibt es einen Weg, einen Cookie beim Start der Seite mit einem Wert zu füllen, der vorhanden ist?

    Achso, vielleicht bin ich in diesem Forum auch falsch, ich habe das ASP.NET Forum nicht gefunden :) Sorry.

    Danke im voraus für die Tipps.


    Liebe Grüße, die Luzie!


    • Bearbeitet Luzie Montag, 10. November 2014 16:36
    • Verschoben Stefan FalzModerator Montag, 10. November 2014 16:40 ASP.NET Frage
    Montag, 10. November 2014 16:33

Antworten

  • Hallo Luzie,

    da hast Du evtl. einen Denkfehler.

    Du solltest nicht zwangsläufig nach einem Weg suchen, dem Cookie irgendwie einen Wert zu verpassen, der dann im Client gespeichert aber auch direkt daraus wieder ausgelesen wird. Das funktioniert so nämlich nicht.

    Du solltest eher schauen, ob der Wert im QueryString gesetzt ist und falls ja, nimmst Du den. Wenn nicht, nimmst Du den Wert aus dem Cookie. Ist der auch nicht gesetzt, nimm die Defaulteinstellung.

    Dim Language                As String     = "de"
    Dim LanguageCookie          As HttpCookie = Request.Cookies( "cult" )
    Dim LanguageFromQueryString As String     = Request.QueryString( "lang" )
    
        If Not String.IsNullOrEmpty( LanguageFromQueryString ) Then
            Language = LanguageFromQueryString
        ElseIf Not LanguageCookie Is Nothing AndAlso Not String.IsNullOrEmpty( LanguageCookie.Value ) Then
            Language = LanguageCookie.Value
        End if
    
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo( Language )
        Thread.CurrentThread.CurrentCulture  = CultureInfo.CreateSpecificCulture( Language )
    

    Du kannst das natürlich auch rumdrehen, also zuerst aufs Cookie und dann auf den QueryString schauen, das bleibt dir überlassen.

    Ich würde am Ende noch eine Prüfung einbauen und schauen, ob die Sprache aus einer der beiden Quellen zugewiesen werden konnte. Falls nicht, solltest Du dem Client das Cookie mit der Spracheinstellung schicken.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Luzie Dienstag, 11. November 2014 20:15
    Montag, 10. November 2014 22:04
    Moderator

Alle Antworten

  • Hallo Luzie,

    das ASP.NET Forum ist noch immer dort, wo es in den letzten Jahren auch war.

      https://social.msdn.microsoft.com/Forums/de-DE/home?forum=aspnetajaxmvcde

    Du hast doch dort schon einige Fragen gepostet, daher frage ich mich, warum Du es nicht mehr gefunden hast.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 10. November 2014 16:42
    Moderator
  • ich habe es ja später gefunden, aber war schon zu spät.

    Liebe Grüße, die Luzie!

    Montag, 10. November 2014 17:53
  • Hallo Luzie,

    deine Beschreibung ist (zumindest für mich) nicht wirklich aussagekräftigt.

    Was ist bei dir der "Start der Seite"?

    Wie willst Du serverseitig einen Wert aus einem Textfeld in ein Cookie schreiben, bevor der Wert an den Server übermittelt wird?

    Beschreib doch mal bitte den genauen zeitlichen Abflauf von dem, was Du machen willst und schreib jeweils dabei, was da nun wie bei jedem Schritt aufgerufen werden soll.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 10. November 2014 17:59
    Moderator
  • In der Global.asax habe ich den Cookie für die Sprache bereits angelegt.
     
    ' --- Cookie für Culture
            Dim lang As String = "de"
        
            'default to the invariant culture
            Dim cookie As HttpCookie = Request.Cookies("cult")
    
            If cookie IsNot Nothing AndAlso cookie.Value IsNot Nothing Then
                lang = cookie.Value
    
            Else
                lang = "de"
     
            End If
    
            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang)
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang)
    Normalerweise wechselt der User die Sprache über einen Imagebutton. Das funktioniert auch.   

    Aber jetzt im aktuellen Fall suche ich nach einer Möglichkeit, die Sprache direkt nach Start der Seite festzulegen. 

    Bsp. Nach einem Webinar sollen die Teilnehmer eine Online-Erfolgskontrolle durchführen. Sie bekommen dafür einen Link auf die Seite mit dem Fragebogen zugeschickt, worin die Spracherkennung als Parameter im querystring enthalten ist, z.B. lang=en und die ID des Fragebogens. Die Spracherkennung könnte auch in einem Hiddenfield auf der Seite festgelegt werden, das ist eigentlich egal.

    Wie kann ich jetzt ohne ein Event auszulösen (Button-click) dem Cookie direkt über den Parameter die Sprache zuweisen? Geht das überhaupt, so wie ich das vorhabe?

    Liebe Grüße, die Luzie!

    Montag, 10. November 2014 18:35
  • Hallo Luzie,

    da hast Du evtl. einen Denkfehler.

    Du solltest nicht zwangsläufig nach einem Weg suchen, dem Cookie irgendwie einen Wert zu verpassen, der dann im Client gespeichert aber auch direkt daraus wieder ausgelesen wird. Das funktioniert so nämlich nicht.

    Du solltest eher schauen, ob der Wert im QueryString gesetzt ist und falls ja, nimmst Du den. Wenn nicht, nimmst Du den Wert aus dem Cookie. Ist der auch nicht gesetzt, nimm die Defaulteinstellung.

    Dim Language                As String     = "de"
    Dim LanguageCookie          As HttpCookie = Request.Cookies( "cult" )
    Dim LanguageFromQueryString As String     = Request.QueryString( "lang" )
    
        If Not String.IsNullOrEmpty( LanguageFromQueryString ) Then
            Language = LanguageFromQueryString
        ElseIf Not LanguageCookie Is Nothing AndAlso Not String.IsNullOrEmpty( LanguageCookie.Value ) Then
            Language = LanguageCookie.Value
        End if
    
        Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo( Language )
        Thread.CurrentThread.CurrentCulture  = CultureInfo.CreateSpecificCulture( Language )
    

    Du kannst das natürlich auch rumdrehen, also zuerst aufs Cookie und dann auf den QueryString schauen, das bleibt dir überlassen.

    Ich würde am Ende noch eine Prüfung einbauen und schauen, ob die Sprache aus einer der beiden Quellen zugewiesen werden konnte. Falls nicht, solltest Du dem Client das Cookie mit der Spracheinstellung schicken.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert Luzie Dienstag, 11. November 2014 20:15
    Montag, 10. November 2014 22:04
    Moderator
  • Hallo Stefan,

    das ist mir einleuchtend.

    Ich habe das jetzt auch mal in der Global.asax so geändert.

    Wenn ich allerdings den Parameter lang=en an die Seite sende kommt wieder die NullReferenz.

    Also der querystring wird eindeutig übergeben, der Cookie wird auch gesetzt, allerdings kann ich den Wert nicht auslesen.

    Folgende Fehlermeldung kommt:

    System.NullReferenceException: Object reference not set to an instance of an object.

    Line 47:         If Request.Cookies("cult") Is Nothing Then
    Line 48:             Me.lblcult.Text = "ja" & Request.Cookies("cult").Value
    Line 49:         Else
    Line 50:             lblcult.Text = "nein"

    Wenn das alles nichts hilft, muss ich die resx Dateien abfragen.


    Liebe Grüße, die Luzie!

    Dienstag, 11. November 2014 16:55
  • Hallo Luzie,

    wenn Du Response.Cookies( ... ) setzt, wird das Cookie erst beim nächsten Seitenaufruf vom Client an den Server gesendet. Also ist auch erst dann Request.Cookies( "cult" ) vorhanden.

    Poste doch mal ein reproduzierbares Beispiel mit der ganzen Methode. Also auslesen Parameter + Cookie, Zuweisen Wert, schreiben Cookie, lesen Cookie.

    Welche Code Zeile genau verursacht eigentlich den Fehler?


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 11. November 2014 17:06
    Moderator

  • Liebe Grüße, die Luzie!

    Dienstag, 11. November 2014 18:16

  • Leider kann ich zurzeit nichts posten, es wird nichts gespeichert. Ich versuche es gleich nochmal.

    Das ist der Code, den ich in der global.asax ausgetauscht habe.

     Dim Language As String = "de"
            Dim LanguageCookie As HttpCookie = Request.Cookies("cult")
            Dim LanguageFromQueryString As String = Request.QueryString("lang")
            
            If Not LanguageCookie Is Nothing AndAlso Not String.IsNullOrEmpty(LanguageCookie.Value) Then
                Language = LanguageCookie.Value
            ElseIf Not String.IsNullOrEmpty(LanguageFromQueryString) Then
                Language = LanguageFromQueryString
            End If
    
            Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(Language)
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(Language)

    Der Parameter wird übergeben:

    webinaraddupdate.aspx?kursid=1234&lang=en

    Das ist das Page_Load event. Die Fehlermeldung hat sich erledigt.
    Ich habe das "not" vergessen, ist irgendwie abhanden gekommen, ohne dass ich es gemerkt habe und manchmal sieht man den Wald vor lauter Bäumen nicht. :)

    Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
            ' ReadCookie()
            If Request.Cookies("cult") Isnot Nothing Then
               Me.lblcult.Text = "ja" & Request.Cookies("cult").Value
            Else
                lblcult.Text = "nein"
            End If
    
            If Not Page.IsPostBack Then
    
                Dim kursid As Integer = 0
                If Request.QueryString("kursid") IsNot Nothing Then
                    kursid = Request.QueryString("kursid")
                End If
                Me.hdkursid.Value = kursid
                bindmydata()
            End If
        End Sub

    Dies wird über ein Click-event ausgelöst, da werden die Cookies gesetzt.

    Protected Sub getcookie(sender As Object, e As EventArgs)
    
            Dim btn As Button = CType(sender, Button)
    
            Dim cult As String = "de"
            Dim cookie As New HttpCookie("cult")
    
            Select Case btn.ID
                Case "btnDE"
                    cult = "de"
                Case "btnEN"
                    cult = "en"
            End Select
    
            cookie.Value = cult
            Response.SetCookie(cookie)
            Response.Redirect(Request.Url.ToString)
        End Sub


    • Bearbeitet Luzie Dienstag, 11. November 2014 18:23
    Dienstag, 11. November 2014 18:21
  • Hallo Stefan,

    die Sache ist glaube ich gelöst.

    Ich wollte immer den Wert des Cookies auslesen. Aber der ist ja nicht nötig. Ich dachte immer, wenn der Cookie den entsprechenden Wert zurückgibt, wird der Culture auch korrekt gesetzt.Und da bin ich hängen geblieben.

    Mit Deiner Änderung in der Global.asax gibt die mir die Resource die richtige Sprache zurück.

    Danke nochmals, ich glaube, das wars :)


    Liebe Grüße, die Luzie!

    Dienstag, 11. November 2014 20:15