web-dev-qa-db-fra.com

Comment conserver la variable sur la publication

J'ai créé une seule page (avec du code derrière .vb) et créé Public intFileID As Integer

dans le chargement de la page, je vérifie la chaîne de requête et l'affecte si elle est disponible ou définit 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 existe 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. J'ai besoin de pouvoir conserver cette valeur sur la publication pour que tout fonctionne.

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

Comment puis-je conserver la valeur définie dans intFileID sans créer quelque chose dans le code HTML qui pourrait éventuellement être modifié.

[MODIFIER] Modification de la propriétéialisez-la pour utiliser ViewState pour conserver 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
23
Brian Boatright

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

Dans VB, vous stockeriez un élément dans le ViewState comme:

ViewState(key) = value

Et récupérez-le comme:

value = ViewState(key)
43
jerhinesmith

Magasin en:

  • Session
  • ViewState
  • Entrée cachée
5
Kon

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 cela fonctionnera dans les environnements de batterie de serveurs Web, la session ne le fait pas, il ne le stocke pas sur le serveur en attendant que l'utilisateur, jusqu'à 20 minutes à supprimer, et en général viewstate est l'endroit où il faut être pour la page données de niveau.

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

5
Mitchel Sellers

Stockez-le dans la session.

Page.Session["MyPage_FileID"] = intFileID

Vous aurez besoin d'une logique qui la gère lorsque l'utilisateur navigue, mais si elle est toujours définie lorsque la page se charge à partir d'un GET (ou si vous la désactivez, si elle n'est pas disponible sur GET), vous devriez pouvoir l'utiliser plus tard à partir de la session sur votre PostBack d'envoi.

4
tvanfosson

Rappelles toi:

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

2
Joel Coehoorn

Session["KeyName"] = your value;

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

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

ou

ViewState["KEY"]= value;

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

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

1
Sahil Saini

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 désactivé 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
1
Chad

En fait, puisqu'une page ASP.NET se publie sur elle-même - y compris la chaîne de requête - vous pouvez simplement supprimer le If Not Page.IsPostBack état. Ensuite, il se mettait sur chaque post.

1
Mark Brackett

Je vais utiliser Session comme suggéré par tvanfosson. ViewState et HiddenField peuvent être trop lourds si vous souhaitez conserver de grandes données comme un jeu de données pour les commentaires dans les pages de sujet d'un forum ..

0
Sen Jacob