2009-03-30 5 views
1

Update: die klarste Erklärung, die ich im Internet gefunden habe, wie ich durch dieses Problem gekämpft habe, kann here gefunden werden.Anfänger Wie pflegen Sie Zustand in einer ASP C# -Website

Vielleicht verstehe ich einfach nicht das Modell von Runat-Server furchtbar gut. Es scheint, dass der folgende Code immer den if-Block ausführt. Wenn der Code auf der Serverseite läuft, kann ich verstehen, dass er zustandslos sein muss.

Ich bin ein erfahrener Nicht-Web-Programmierer, aber es scheint mir gegensätzlich zu sein. Muss ich eine Art Sitzungsobjekt erstellen oder den aktuellen Status in der URL weitergeben oder was?

<script runat="server"> 

DateTime begin; 
DateTime end; 
int iSelectedStart = 0; 
int iSelectedEnd = 0; 
int iPutName = 0; 

protected void Button1_Click(object sender, EventArgs e) 
{ 
    if (iPutName == 0) 
    { 
     iPutName = 1; 
     Label1.Text = TextBox1.Text + " you will be slecting your start and end dates."; 

Antwort

2

Es sieht so aus, als ob ein Teil Ihres Codes abgeschnitten wurde, aber hier ist die grundlegende Sache mit Web-Programmierung - es ist zustandslos. Es sei denn, Sie tun etwas (verwenden Sie ViewState, Session usw.), um einen Zustand in den Mix einzufügen.

In Ihrem Fall sieht es so aus, als ob Sie einen Zustand durch Aktualisierung der Seite beibehalten möchten. Setzen Sie die Werte, die Sie beibehalten möchten, in ViewState, um sie über Postbacks auf derselben Seite zu halten. Wenn Sie Werte auf mehreren Seiten Ihrer Website speichern möchten, verwenden Sie Sitzung. Wenn Sie bei Besuchen der Site Werte beibehalten möchten, legen Sie sie in einer Datenbank ab und verknüpfen Sie sie mit einem Login oder Cookie.

+0

Guter Punkt über Sitzung über mehrere Seiten vs. ViewState auf der einen Seite sein. – Damovisa

0

Da ASP.NET staatenlos ist, ist das, was Sie annehmen, korrekt. Das Postback führt dazu, dass die Seite die Variable für iPutName verliert. Das Speichern in Sitzung ist eine Option, oder das Speichern in Viewstate könnte eine andere Option sein.

Die wichtigste Sache, die hier zu verstehen ist, ist, wie der ASP.NET-Seitenlebenszyklus funktioniert und was jedes Mal passiert, wenn Sie auf den Server zurückschreiben.

2

Die wichtige Sache, an die man sich hier erinnert, ist, dass das Web zustandslos ist. Jede Anfrage vom Browser einer Person ist vollständig von allen vorherigen Anfragen getrennt. Was passiert mit Ihrem Code ist, dass die Klasse jedes Mal neu erstellt wird, wenn der Client eine Seite anfordert. Dazu gehört das Klicken auf Button1.

Wenn Werte zwischen Anforderungen bestehen bleiben sollen, müssen Sie sie an einem Speicherort speichern, an dem sie später abgerufen werden können. Das Session-Objekt stellt dies für Sie bereit.

Grundsätzlich müssen Sie die iPutName-Variable in der Sitzung irgendwie speichern. Wahrscheinlich ist der schönste Weg, um es in einer Immobilie zu kapseln:

protected int iPutName 
{ 
    get { 
     if (Session["iPutName"] == null) 
      Session["iPutName"] == 0; 
     return Session["iPutName"]; 
    } 
    set { Session["iPutName"] = value; } 
} 

Edit: Das Viewstate-Objekt als gut funktionieren wird (solange Viewstate wird auf der Seite eingeschaltet). Dies codiert den Wert in einem versteckten Feld im HTML und dekodiert es, wenn es zurückkommt.

Bearbeiten (wieder): Entschuldigung für wiederholte Bearbeitungen, aber ich sollte dies aufklären. Was Jonathan und Emil gesagt haben, ist richtig. Sie sollten wahrscheinlich ViewState anstelle von Session verwenden, es sei denn, Sie möchten, dass dieser Wert zwischen den Seiten verfügbar bleibt. Beachten Sie, dass hierfür ViewState is turned on erforderlich ist und dass eine größere Nutzlast an den Client gesendet wird.

+0

Ein guter Punkt aus Jonathans Antwort - das Session-Objekt wird auf allen Seiten Ihrer Anwendung beibehalten. ViewState ist nur auf derselben Seite persistent. – Damovisa

0

Für den Lebenszyklus, überprüfen Sie die folgende URL aus:

Session["iPutName"] = iPutName; 

die Session-Variable Fetching ist auch einfach, aber Sie sollten: http://www.eggheadcafe.com/articles/20051227.asp

Sie Ihre iPutName in der Sitzung, indem Sie diese speichern kann sicher sein, eine NULL zu überprüfen, wie dies zu tun:

if (Session["iPutName"] != null) iPutName = Session["iPutName"]; 

Hat jemand von nicht getestet, aber wenn man Fehler auftreten ... sorry ;)

+0

Dieser Link ist ein wenig gruselig ... – ojblass

2

Ich empfehle wirklich, das Schnellstart-Tutorial zu betrachten.

http://quickstarts.asp.net/QuickStartv20/aspnet/Default.aspx

Es gibt viele Konzepte in dot net Zustand auf der Benutzeroberfläche zu simulieren. In Ihrem Fall denke ich, was Sie wirklich tun möchten, ist Viewstate. Sitzungen sollten mit Vorsicht verwendet werden und ich denke, dass das Konzept, nach dem Sie suchen, auf der Seite lokalisiert wurde, nicht auf der Benutzersitzung.

Sie sollten auch das Konzept Codebehind/Codefront ebenfalls betrachten.

0

Die URL, die Sie in Ihrem Update gepostet haben, ist definitiv nicht "Alles was Sie wissen wollen" über ViewState .... nicht mal annähernd. Ich habe nur seinen Artikel gescannt, aber er scheint den Page Life Cycle überhaupt nicht anzusprechen. Wenn Ihr den View State Route dann lesen Sie diese 2 Links gehen:

Understanding ASP.NET View State by Scott Mitchell

Truly Understanding ViewState By Dave Reed

Wenn Sie neu dann zu Viewstate-Dump ganze guff (1 Hälfte des Artikels) über Viewstate Parsen erwähnt in Ihr verknüpfter Artikel. Es wird einfach nur für hoch spezialisierte Szenarien benötigt. Es ist definitiv nicht normal, re: ViewState zu machen.