2008-10-21 7 views
22

J'ai créé une seule page (avec le code derrière .vb) et créé intFileID public As IntegerComment Persister variable sur Postback

la charge Page Je vérifie la querystring et lui attribuer le cas échéant ou définir 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 

Il y a un événement de clic pour le bouton Soumettre qui insère ou met à jour un enregistrement en fonction de la valeur de la variable intFileID. Je dois être en mesure de conserver cette valeur sur la publication pour que tout fonctionne.

La page insère ou met à jour simplement un enregistrement dans une base de données SQL. Je n'utilise pas un gridview, formview, detailedview, ou tout autre objet de type rad qui persiste la valeur de la clé par lui-même et je ne veux pas utiliser l'un d'eux.

Comment est-ce que je peux persister la valeur définie dans intFileID sans créer quelque chose dans le HTML qui pourrait être changé.

[EDIT] Changé Page_Load pour utiliser ViewState persister la valeur 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 

Répondre

40

Comme d'autres l'ont souligné, vous pouvez stocker dans la session ou le ViewState. Si c'est spécifique à une page, j'aime la stocker dans ViewState plutôt que dans la Session, mais je ne sais pas si une méthode est généralement préférée à l'autre.

En VB, vous stockerait un élément dans le ViewState comme:

ViewState(key) = value 

Et le récupérer comme:

value = ViewState(key) 
+0

Wow. Ne cliquez pas sur le lien. Spam ville. –

+0

Yikes. Doit avoir changé depuis 2008. Retiré. – jerhinesmith

4

magasin dans la session.

Page.Session["MyPage_FileID"] = intFileID 

Vous aurez besoin d'avoir une logique qui gère comme l'utilisateur navigue autour, mais si elle est définie toujours quand la page se charge d'un EEG (ou vous désactivez, sinon disponible sur GET) vous devrait être OK en l'utilisant plus tard de la session sur votre PostBack de soumission.

+0

merci! Où devrais-je définir la valeur? juste après l'initialisation de intFileID dans le chargement de la page? –

+0

Ajoutez-le à la session après qu'elle a sa valeur finale. Dans votre cas, après avoir défini la valeur à partir des paramètres de la demande. – tvanfosson

4

magasin dans:

  • session
  • ViewState
  • d'entrée cachée
2

Rappelez-vous:

Chaque fois que votre code serveur est exécuté, il est dans une nouvelle instance de votre classe de page. C'est pour chaque publication.

5

Juste pour résumer ce qui est dit ci-dessus.

Vous pouvez utiliser Session, Viewstate ou un champ masqué. Personnellement, je préfère viewstate car il fonctionnera dans les environnements de ferme Web, Session ne le fait pas, il ne le stocke pas sur le serveur en attente de l'utilisateur, jusqu'à 20 minutes pour être supprimé, et en général viewstate est l'endroit être pour les données au niveau de la page.

Vous pouvez utiliser un champ masqué, mais un utilisateur pourrait alors le modifier plus facilement.

+0

merci pour les détails sur Session. Cette application ne sera probablement jamais mise à l'échelle au-delà d'un compte d'hébergement partagé, mais il est bon de savoir à l'avance. –

1

En réalité, étant donné qu'une page ASP.NET se publie sur elle-même, y compris la chaîne de requête, vous pouvez simplement supprimer la condition If Not Page.IsPostBack. Ensuite, il se mettrait sur chaque publication.

1

Personnellement, je choisirais de stocker la valeur dans l'état de contrôle au lieu de viewstate car viewstate peut facilement être désactivé. ControlState persistera même si viewstate est éteint pour une raison quelconque. J'ai inclus un exemple sur la façon dont cela peut être fait.

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

merci pour l'échantillon. Je vais devoir lire sur cette méthode. –

0

Je vais utiliser session comme suggested by tvanfosson. ViewState et HiddenField peut-être trop lourd si vous voulez conserver des données volumineuses comme un ensemble de données pour commentaires dans une des pages thématiques du forum ..

1

Session["KeyName"] = your value;

  1. type cast du type pour récupérer et stocker les données de la session comme ci-dessous:

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

ou

ViewState["KEY"]= value;

  1. type cast du type pour récupérer et stocker les données de la session comme indiqué ci-dessous:

String str = (String)ViewState["KEY"];

+0

Session est le meilleur choix car il va persister la valeur pour la session où l'état d'affichage persistera de POST à ​​POST, c'est-à-dire chaque fois qu'il y a post-retour la valeur de la variable sera définie selon la valeur dans l'état. Pour plus d'informations, consultez la rubrique Présentation de ASP.NET ViewState [https://msdn.microsoft.com/fr-fr/library/ms972976.aspx]. –

Questions connexes