2008-10-21 15 views
22

Ich habe eine einzelne Seite (mit Code hinter .vb) und erstellt öffentliche intFileID As IntegerWie Variable Persist auf Postback

in der Seite Last I für die Abfragezeichenfolgeflag überprüfen und weisen Sie ihn zur Verfügung, wenn oder eingestellt intFileID = 0

.
Public intFileID As Integer = 0 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not Page.IsPostBack Then 
     If Not Request.QueryString("fileid") Is Nothing Then 
      intFileID = CInt(Request.QueryString("fileid")) 
     End If 

     If intFileID > 0 Then 
      GetFile(intFileID) 
     End If 
    End If 
End Sub 

Private Sub GetFile() 
    'uses intFileID to retrieve the specific record from database and set's the various textbox.text 
End Sub 

Es ist ein Click-Ereignis für die Schaltfläche Senden, die aktualisiert fügt oder einen Datensatz auf den Wert der variablen intFileID basiert. Ich muss in der Lage sein, diesen Postback-Wert beizubehalten, damit alles funktioniert.

Die Seite fügt einfach einen Datensatz in eine SQL-Datenbank ein oder aktualisiert ihn. Ich verwende keine gridview, formview, detailsview oder irgendein anderes Radartobjekt, das den Schlüsselwert für sich behält und ich keines von ihnen verwenden möchte.

Wie kann ich den in intFileID festgelegten Wert beibehalten, ohne etwas im HTML zu erzeugen, das möglicherweise geändert werden kann.

[EDIT] Changed Page_Load Viewstate zu verwenden, um den Wert intFileID

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    If Not Page.IsPostBack Then 
     If Not Request.QueryString("fileid") Is Nothing Then 
      intFileID = CInt(Request.QueryString("fileid")) 
     End If 

     If intFileID > 0 Then 
      GetFile(intFileID) 
     End If 

     ViewState("intFileID") = intFileID 
    Else 
     intFileID = ViewState("intFileID") 
    End If 
End Sub 

Antwort

40

Wie andere haben darauf hingewiesen, können Sie es in der Session oder der Viewstate speichern kann. Wenn es seitenspezifisch ist, möchte ich es lieber im ViewState als in der Session speichern, aber ich weiß nicht, ob eine Methode der anderen gegenüber bevorzugt ist.

In VB, würden Sie ein Element speichern in der Viewstate wie:

ViewState(key) = value 

und abrufen es mögen:

value = ViewState(key) 
+0

Wow. Klicken Sie nicht auf den Link. Spam-Stadt. –

+0

Huch. Muss sich seit 2008 geändert haben. Entfernt. – jerhinesmith

4

Bewahren Sie es in der Session bestehen bleiben.

Page.Session["MyPage_FileID"] = intFileID 

Sie müssen Logik haben, die es als der Benutzer um navigiert verwaltet, aber wenn es beim Laden der Seite von einem GET immer gesetzt ist (oder Sie es deaktivieren, wenn sie nicht auf der GET) Sie dann sollte in Ordnung sein, um es später von der Sitzung auf Ihrem PostBack Post zu senden.

+0

danke! Wo soll ich den Wert einstellen? gleich nach dem Initialisieren von IntFileID in der Seite laden? –

+0

Fügen Sie es der Sitzung hinzu, nachdem es seinen endgültigen Wert hat. In Ihrem Fall, nachdem Sie den Wert aus den Anfrageparametern festgelegt haben. – tvanfosson

4

Shop in:

  • Session
  • Viewstate
  • versteckter Eingang
2

Denken Sie daran:

Jedes Mal, wenn Ihr Server-Code ausgeführt wird, ist es in einer brandneuen Instanz Ihrer Seitenklasse. Das ist für jeden Postback.

5

Nur um zusammenzufassen, was oben gesagt wird.

Sie können Session, Viewstate oder ein verstecktes Feld verwenden.

Ich persönlich bevorzuge viewstate wie es in Webfarm-Umgebungen funktioniert, Sitzung nicht, es speichert es nicht auf dem Server wartet auf den Benutzer, bis zu 20 Minuten entfernt werden, und im Allgemeinen Viewstate ist der Ort für Daten auf Seitenebene sein.

Sie können ein verstecktes Feld verwenden, aber ein Benutzer könnte es einfacher ändern.

+0

danke für die Details über Session. Diese App wird wahrscheinlich niemals auf ein Shared Hosting-Konto skalieren, aber es ist gut, es im Voraus zu wissen. –

1

Eigentlich, da eine ASP.NET-Seite an sich selbst zurücksendet - einschließlich der Abfragezeichenfolge - könnten Sie einfach die If Not Page.IsPostBack Bedingung entfernen. Dann würde es sich auf jeden Postback einstellen.

1

Ich persönlich würde wählen, um den Wert im Kontrollzustand statt Viewstate zu speichern, da Viewstatus leicht ausgeschaltet werden kann. ControlState bleibt bestehen, auch wenn der Viewstatus aus irgendeinem Grund ausgeschaltet ist. Ich habe ein Beispiel hinzugefügt, wie das gemacht werden kann.

Private intFileId As Integer = 0 

Public Property FileID() As Integer 
    Get 
     Return intFileId 
    End Get 
    Set(ByVal value As Integer) 
     intFileId = value 
    End Set 
End Property 


Protected Overrides Function SaveControlState() As Object 
    Dim objState(2) As Object 
    objState(0) = MyBase.SaveControlState() 
    objState(1) = Me.FileID 
    Return objState 
End Function 


Protected Overrides Sub LoadControlState(ByVal savedState As Object) 
    Dim objState() As Object 
    objState = savedState 
    MyBase.LoadControlState(objState(0)) 
    Me.FileID = CInt(objState(1)) 
End Sub 




Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 
    Me.Page.RegisterRequiresControlState(Me) 
End Sub 


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    If Not Page.IsPostBack Then 
     If Not String.IsNullOrEmpty(Request.QueryString("fileid")) Then 
      Me.FileID = CInt(Request.QueryString("fileid")) 
     End If 
    End If 

    Response.Write(Me.FileID.ToString()) 
End Sub 
+0

danke für die Probe. Ich werde über diese Methode nachdenken müssen. –

0

Ich werde verwenden Session als suggested by tvanfosson. Viewstate und Hidden könnte zu schwer sein, wenn Sie große Daten wie ein Datensatz für Kommentare in einem Forum des Themenseiten ..

1

Session["KeyName"] = your value;

behalten möchten
  1. Typ Guss auf die Art der Daten von Sitzung abrufen und zu speichern, wie unten angegeben:

Datatable dt = (DataTable)(Session["KeyName"]);

oder

ViewState["KEY"]= value;

  1. Typ Guss auf die Art der Daten von Sitzung abrufen und zu speichern, wie unten angegeben:

+0

Sitzung ist die bessere Wahl, da sie den Wert für die Sitzung beibehalten wird, wo der Ansichtszustand von POST zu POST bestehen bleibt, d. H., Jedes Mal, wenn Post zurück gegeben wird, wird der Wert der Variablen entsprechend dem Wert in dem Zustand gesetzt. Weitere Informationen finden Sie unter Grundlegendes zu ASP.NET ViewState [https://msdn.microsoft.com/en-us/library/ms972976.aspx]. –