2016-06-21 5 views
0
  • Steuerelement (z. B. Etikett) ändert Wert beim Laden der Seite.
  • vor Laden der Seite, Etikettenwert „x“
  • geht Seite laden natürlich x an diesem Punkt verloren geht, so was ein einfacher Weg ist, den Wert der vorherigen Seite Last zu speichern?
+0

Statusverwaltung- https://msdn.microsoft.com/en-us/library/75x4ha6s.aspx – riteshmeher

+0

Eine statische Variable ist normalerweise der einfachste Weg, dies zu tun. Dann überprüfe einfach, ob die Variable die gleiche bleibt wie eine Testmethode. – Adam

+4

@Adam eine statische Variable in einer Webseite ist _shared zwischen allen Ansichten der Seite _ – stuartd

Antwort

-1

Ich bin mir nicht sicher, ob dies ist, was Sie ohne Code-Beispiele bedeuten, aber ich aus dem Gedächtnis weiß in ASP.NET, dass Sie die vorherige Seite Eigenschaft wie so zugreifen:

Page lastPage = currentPage.PreviousPage 

Welche zurück das gesamte Seitenobjekt. Angenommen, Ihr Label ist wie so definiert:

<asp:label id="myLabel" runat="server" /> 

Dann können Sie den Text Eigenschaft Zugriff mit:

Label myLabel = lastPage.FindControl("myLabel") as Label; 
lastPageVal = myLabel.Text 

So sicher, dass lastPageVal eine statische Variable ist, dann wird es auch im ganzen Seiten bestehen.

0

Es klingt wie, was Sie wollen, ist eine Geschichte der vorherigen Zustände der Seite, oder mindestens einen vorherigen Wert. Ich kann einen Weg vorschlagen, dies zu tun, aber mit einem Vorbehalt: Übertreibe es nicht. Sie können Daten zwischen Posts in ViewState beibehalten, aber diese Daten werden auf die Seite selbst geschrieben. Wenn die Benutzer das Formular posten, werden diese Daten ebenfalls zurückgesendet. (Mehr am Ende.)

Hier ist ein einfaches Beispiel. Zunächst definieren eine Klasse, die alle zusätzlichen Zustand enthält, die Sie speichern möchten:

[Serializable] 
public class PageState 
{ 
    public string MyLabelPreviousText {get;set;} 
} 

Dann im Code hinter:

public partial class MainPage : System.Web.UI.Page 
{ 
    private PageState _pageState; 

    protected void Page_Load(object source, EventArgs e) 
    { 
     _pageState = ViewState["pageState"] as PageState ?? new PageState(); 
     _pageState.MyLabelPreviousText = MyLabel.Text; 
    } 

    protected void Page_PreRender(object sender, EventArgs e) 
    { 
     ViewState["pageState"] = _pageState; 
    } 

Wenn Sie die Seite laden, Sie überprüfen, ob zu sehen Sie haben Ihre Klasse bereits gespeichert (in diesem Fall PageState) an die ViewState. Wenn nicht, erstellen Sie eine neue.

Im Ereignis PreRender, nachdem Sie die Seite aktualisiert haben, aktualisieren Sie diese Klasse mit dem Text Ihres Labels und speichern das Ganze dann erneut unter ViewState. Auf diese Weise können Sie das nächste Mal, wenn die Seite geladen wird, erneut abrufen.

Ich bin mir nicht sicher, an welcher Stelle Sie den vorherigen Text Ihres Etiketts speichern möchten. In diesem Beispiel wird der Text während des Ereignisses Load gespeichert. Wenn der Text von da an geändert wird, ist der von Ihnen gespeicherte Wert der ursprüngliche Text des Etiketts. Die Details können variieren, je nachdem, was Sie versuchen, aber dieses Muster ermöglicht es Ihnen, diese Art von benutzerdefinierten Daten zu speichern, ohne Session zu verwenden und Daten wie diese im Speicher zu stapeln.

Ich erwähnte nicht zu viel davon. Wenn Sie einige Beschriftungen, Steuerelemente und andere Daten speichern, wird ViewState wahrscheinlich nicht zu groß. ASP.NET setzt den Status jedes Serversteuerelements ohnehin dort bereits fest. Aber wenn Sie wirklich verrückt damit gehen, dann ViewState kann riesig werden. Alle diese Daten werden auf die Seite geschrieben und alles wird mit jedem Postback zurück an den Server gesendet.

Es ist wahrscheinlich keine große Sorge, aber darauf achten.Verwenden Sie die Chrome-Entwicklungstools, Fiddler, oder überprüfen Sie einfach Ihre Seitenquelle, um festzustellen, ob diese Daten so groß werden, dass sie die Leistung beeinträchtigen.

Für alle, die nicht vertraut ist, sieht ViewState wie dies in der HTML-Quelle:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
    value="/wEPDwULLTEyMzgxNzgyNDIPZBYCZg9kFgICAQ9kFggCAQ9kFgJmD2QWAgIBD2QWAmYPZBYMA 
... etc. 

Wie Sie sehen können, ist es Eingang tatsächlich eine versteckte Form ist. ASP.NET legt alle Details der Steuerelemente der Seite in dem Formular so fest, dass wenn Sie das Formular bereitstellen, es all das zusammentücken und sicherstellen kann, dass die Seite nach Postbacks identisch aussieht. Das ist der Grund, warum, wenn wir beim ersten Mal eine Menge Kontrollen einrichten, wir if(!IsPostBack()) überprüfen. Wenn es ein Postback ist, müssen wir die Dropdownlisten usw. nicht noch einmal auffüllen. Sie werden von diesen ViewState Daten wiederhergestellt.

Dieser Ansatz entspricht funktional dem Hinzufügen eines zusätzlichen verborgenen Eingangs, wie in einem Kommentar vorgeschlagen. Der Unterschied besteht darin, dass Sie eine vorhandene versteckte Eingabe (viewstate) verwenden und wenn Sie mehrere Werte speichern müssen, erstellen Sie sie nur als Eigenschaften einer Klasse, anstatt mehr und mehr versteckte Eingaben hinzuzufügen.

+0

Scott Danke für die ausführliche Antwort. Ich habe allerdings ein paar Zweifel. In meinem Fall, in dem ich die Werte für die zukünftige Verwendung speichern möchte, gibt es eine Button_Click-Methode, die von einer anderen Methode aufgerufen wird, die von Page_Init aufgerufen wird. Daher füge ich am Ende meiner Button_Click-Methode den Code für Page_Load hinzu, nachdem die gesamte Verarbeitung abgeschlossen ist. Ich möchte den früheren Wert am Anfang der gleichen Methode abrufen. Also verschiebe ich 'ViewState [" pageState "] = _pageState;' am Anfang von Button_Click und woher lese ich tatsächlich die Informationen, die ich brauche? Sollte ich nicht in der Lage sein, _pageState zu lesen? –

+0

Warum auch _pageState überhaupt verwenden? Kann ich nicht mit ViewState alleine arbeiten und von ViewState lesen, bevor ich es mit meinem nächsten Wert überschreibe? –

Verwandte Themen