2016-05-20 20 views
1

Ich habe ein praktisches "Benutzersteuerelement" für die Anmeldung auf meiner Website erstellt und es befindet sich im Site-Master.Sitzung, die erstellt wurde, nachdem das Postback aufgetreten ist und das Seitenladeereignis die Sitzung in ASP.NET nicht korrekt verwendet

Das natürliche Verfahren ist, dass der Benutzer die Website anmeldet und er sollte mit einer Willkommensnachricht angekündigt werden, die seinen vollständigen Namen enthält. Der vollständige Name sollte sich natürlich in einer Sitzungsvariablen befinden, die beim Anmelden des Benutzers erstellt wurde.

Es besteht kein Zweifel, dass wir den gewünschten Code im "page_load" -Ereignis platzieren und erwarten, dass der vollständige Name des Benutzers an die richtigen Umstände übergeben wird (hier eine Beschriftung mit dem Namen lblFullName), um die Willkommensnachricht auszudrucken wenn der Login-Button angeklickt wurde, aber der vollständige Name nicht übergeben wird, bis sich der Benutzer erneut auf der Website anmeldet (zum zweiten Mal).

Warum tritt dieses Problem auf?

Sein ein Teil meines Codes:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Session["FullName"]==null) 
     { 
      //nothing 2 do. 
     } 
     else 
     { 
      lblFullName.Text = Session["FullName"].ToString(); 
     } 
    } 

Antwort

1

Sie wahrscheinlich die Session-Variablen in der Benutzersteuerung nach dem Page_Load Ereignis verarbeitet wurde eingestellt, so dass es nicht den Benutzernamen sehen, bis der nächste Postback.

Um den Aufklebertext, sobald die Anmeldung validiert zu aktualisieren, könnten Sie:

  1. ein Ereignis in der Benutzersteuerung definieren
  2. ein Event-Handler auf der Hauptseite
  3. Anruf registrieren die Event-Handler, sobald der Benutzer in
  4. im Ereignishandler angemeldet hat, aktualisieren Sie den Aufklebertext

Sie co Die Eliminierung der Session -Variable erfolgt auch, indem der vollständige Name des Benutzers in einer von EventArgs abgeleiteten Klasse übergeben wird. Wenn Sie die folgende Klasse zugänglich in der Benutzersteuerung und in der Hauptform machen:

public class StringEventArgs : EventArgs 
{ 
    public string Value { get; set; } 

    public StringEventArgs(string value) 
    { 
     Value = value; 
    } 
} 

dann können Sie dieses Ereignis in der Benutzersteuerung definieren:

public event EventHandler<StringEventArgs> UserLoggedIn; 

In der Funktion, wo die Anmeldung bestätigt wird Sie die Event-Handler aufrufen:

private void UserLoginValidation() 
{ 
    // Login validation is done here 
    bool loginSuccessful = ... 

    if (loginSuccessful && UserLoggedIn != null) 
    { 
     UserLoggedIn(this, new StringEventArgs(fullName)); 
    } 
} 

In der Hauptseite Sie den Event-Handler registrieren, die das Label aktualisiert:

protected void Page_Load(object sender, EventArgs e) 
{ 
    loginUserControl1.UserLoggedIn += loginUserControl1_UserLoggedIn; 
    ... 
} 

private void loginUserControl1_UserLoggedIn(object sender, StringEventArgs e) 
{ 
    lblFullName.Text = e.Value; 
} 
+0

Ich folgte der Lösung, es funktioniert einwandfrei. Danke vielmals. –

+0

Aber da ich neu in ASP.NET und C# Umgebung bin, konnte ich nicht genau verstehen, was passiert ist. Gibt es einen einfacheren Weg mit dem gleichen Sitzungskonzept? –

+0

Ja, Sie könnten die Sitzungsvariable verwenden. Allerdings wäre es nicht so sauber wie meine Lösung. Die Übergabe des Werts als Funktionsargument ist besser als die Verwendung einer Sitzungsvariablen. Globale Variablen sollten nur verwendet werden, wenn andere Lösungen nicht funktionieren. In jedem Fall könnten Sie: (1) "StringEventArgs" nicht erstellen, (2) "UserLoggedIn (this, new StringEventArgs (fullName))" ersetzen; 'By" Session ["FullName"] = fullName; UserLoggedIn (this, EventArgs.Empty); ', (3) Ersetzen Sie' lblFullName.Text = e.Value; 'durch' lblFullName.Text = (string) Session ["FullName"]; '(und' EventArgs' anstelle von 'StringEventArgs' verwenden). – ConnorsFan