Question

Je dois récupérer un enregistrement dans une base de données, l'afficher sur une page Web (j'utilise ASP.NET), mais stocker l'ID (clé primaire) de cet enregistrement quelque part afin de pouvoir revenir à la base de données ultérieurement avec cet identifiant (peut-être pour faire une mise à jour).

Je sais qu'il existe probablement plusieurs façons de procéder, comme stocker l'ID dans ViewState ou un champ caché, mais quelle est la meilleure méthode et quelles sont les raisons pour lesquelles je pourrais choisir cette méthode plutôt que d'autres?

Était-ce utile?

La solution

Cela dépend.

Est-ce que cela vous importe si quelqu'un voit l'ID d'enregistrement? Si vous le faites, les champs masqués et viewstate ne conviennent pas; vous devez le stocker en état de session ou chiffrer viewstate.

Vous inquiétez-vous si quelqu'un soumet le formulaire avec un faux identifiant? Si vous le faites, vous ne pouvez pas utiliser de champ caché (et vous devez considérer la protection CSRF comme un bonus)

Voulez-vous que ce soit immuable mais ne vous inquiétez pas du fait qu’il soit ouvert au visionnage (avec quelques travaux)? Utilisez viewstate et définissez enableViewStateMac = " true " sur votre page (ou globalement)

Voulez-vous le masquer et le protéger mais vous ne pouvez pas utiliser l'état de session? Cryptez votre état d'affichage en définissant les entrées web.config suivantes

<pages enableViewState="true" enableViewStateMac="true" />
<machineKey ... validation="3DES" />

Autres conseils

Voulez-vous que l’utilisateur final connaisse l’ID? Par exemple, si la valeur de l'id est une graine standard 1,1 de la base de données, je pourrais regarder le nombre et voir combien de clients vous avez. Si vous chiffrez la valeur (comme le peut le viewstate), je trouverais beaucoup plus difficile de déchiffrer la clé (mais pas impossible).

L’alternative est de le stocker dans la session. Cela aura pour effet de donner un impact (très petit s’il ne s’agit qu’un entier) sur votre application, mais cela signifie que, en tant qu’utilisateur, je ne vois jamais cette clé primaire. Il expose également l'objet à d'autres parties de votre application, que vous souhaitiez ou non qu'il soit exposé (les objets de session restent jusqu'à ce qu'ils soient effacés, qu'un temps défini (comme 5 minutes) soit écoulé ou que la fenêtre du navigateur soit fermée - à la première de ces éventualités. .

Les valeurs d'état d'affichage entraînent une charge supplémentaire sur le client après chaque publication, car l'état de visualisation enregistre non seulement les objets de la page, mais les mémorise si vous utilisez le bouton Précédent. Cela signifie qu'après chaque post, viewstate devient légèrement plus gros et plus difficile à utiliser. Ils n'existeront que sur la page jusqu'à ce que le navigateur accède à une autre page.

Chaque fois que je stocke un ID dans la page comme ceci, je crée toujours une propriété

public int CustomerID {
    get { return ViewState("CustomerID"); }
    set { ViewState("CustomerID") = value; }
}

ou

    Public Property CustomerID() As Integer
        Get
            Return ViewState("CustomerID")
        End Get
        Set(ByVal value As Integer)
            ViewState("CustomerID") = value
        End Set
    End Property

Ainsi, si vous décidez de passer de Viewstate à une variable de session ou à un champ de formulaire masqué, il vous suffira de la modifier dans la référence de la propriété. Le reste de la page pourra accéder à la variable à l'aide de la section "Page.ID client". ;.

ViewState est une option. Ce n'est valable que pour la page sur laquelle vous vous trouvez. Il ne transmet pas les demandes à d'autres ressources telles que l'objet Session.

Les champs cachés fonctionnent également, mais vous transmettez une petite quantité d'informations sur votre application à une personne suffisamment intelligente pour afficher la source de votre page.

Vous pouvez également stocker l'intégralité de votre enregistrement dans ViewState et peut-être éviter un autre aller-retour vers le serveur.

Personnellement, je suis très réticent à l'idée de mettre quoi que ce soit dans la session. Trop souvent, nos processus de travail ont été cyclés et nous avons perdu notre état de session.

Lorsque vous avez décrit votre problème, je le mettrais dans un champ masqué ou dans l’affichage de la page.

En outre, lorsque vous déterminez où placer les données de ce type, examinez toujours la portée des données. Est-il limité à une seule page ou à la totalité de la session? Si la réponse est "session" pour nous, nous le mettons dans un cookie. (Avertissement: nous écrivons des applications intranet sur lesquelles nous savons que les cookies sont activés.)

Si c'est un simple identifiant qui choisira de le transmettre dans la chaîne de requête, vous n'avez pas besoin de faire de publications et la page est plus accessible pour les utilisateurs et les moteurs de recherche.

Session["MyId"]=myval;

Ce serait un peu plus sûr et offre essentiellement les mêmes mécanismes que de le mettre dans le secteur de la vue

J'ai tendance à coller des choses comme ça dans des champs cachés, je fais juste un peu

 <asp:label runat=server id=lblThingID visible=false />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top