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
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)
Magasin en:
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.
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.
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.
Session["KeyName"] = your value;
- 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;
- 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"];
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
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.
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 ..