J'écris une application Web qui permettra à un utilisateur de naviguer sur plusieurs pages Web du site Web en effectuant certaines demandes. Toutes les informations saisies par l'utilisateur seront stockées dans un objet que j'ai créé. Le problème est que j'ai besoin que cet objet soit accessible depuis n'importe quelle partie du site Web et je ne connais pas vraiment la meilleure façon d'y parvenir. Je sais qu'une solution consiste à utiliser des variables de session mais je ne sais pas comment les utiliser dans asp .net MVC. Et où déclarerais-je une variable de session? Est-ce qu'il y a un autre moyen?
169
Réponses:
Je pense que vous voudrez vous demander si les choses appartiennent vraiment à un état de session. C'est quelque chose que je me surprends à faire de temps en temps et c'est une belle approche fortement typée de l'ensemble, mais vous devez être prudent lorsque vous mettez les choses dans le contexte de la session. Tout ne devrait pas être là simplement parce qu'il appartient à un utilisateur.
dans global.asax hook l'événement OnSessionStart
De n'importe où dans le code où la propriété HttpContext.Current! = Null, vous pouvez récupérer cet objet. Je fais cela avec une méthode d'extension.
De cette façon, vous pouvez dans le code
la source
La réponse ici est correcte, j'ai cependant eu du mal à l'implémenter dans une application ASP.NET MVC 3. Je voulais accéder à un objet Session dans un contrôleur et je ne pouvais pas comprendre pourquoi je continuais à obtenir une "Instance non définie sur une instance d'une erreur d'objet". Ce que j'ai remarqué, c'est que dans un contrôleur, lorsque j'ai essayé d'accéder à la session en procédant comme suit, j'ai continué à obtenir cette erreur. Cela est dû au fait que this.HttpContext fait partie de l'objet Controller.
Cependant, ce que je voulais, c'était le HttpContext qui fait partie de l'espace de noms System.Web car c'est celui que la réponse ci-dessus suggère d'utiliser dans Global.asax.cs. J'ai donc dû faire explicitement ce qui suit:
cela m'a aidé, je ne sais pas si j'ai fait quelque chose qui ne soit pas MO ici, mais j'espère que cela aide quelqu'un!
la source
Parce que je n'aime pas voir "HTTPContext.Current.Session" à propos de l'endroit, j'utilise un modèle singleton pour accéder aux variables de session, cela vous donne un sac de données fortement typé facile d'accès.
alors vous pouvez accéder à vos données de n'importe où:
la source
Si vous utilisez asp.net mvc, voici un moyen simple d'accéder à la session.
D'un contrôleur:
Depuis une vue:
Ce n'est certainement pas la meilleure façon d'accéder à vos variables de session, mais c'est une route directe. Utilisez-le donc avec précaution (de préférence lors du prototypage rapide), et utilisez un Wrapper / Container et OnSessionStart quand cela devient approprié.
HTH
la source
Eh bien, à mon humble avis ...
En ce qui concerne le n ° 1, j'ai une vue principale fortement typée qui a la propriété d'accéder à tout ce que représente l'objet Session .... dans mon cas, la vue principale fortement typée est générique, ce qui me donne une certaine flexibilité en ce qui concerne les pages d'affichage fortement typées
puis...
la source
Bien que je ne connaisse pas asp.net mvc, c'est ce que nous devrions faire sur un site Web .net normal. Cela devrait également fonctionner pour asp.net mvc.
Vous mettriez ceci dans une méthode pour un accès facile. HTH
la source
Il y a 3 façons de le faire.
Je préfère la troisième voie.Ce lien est une bonne référence.
Get / Set HttpContext Session Methods dans BaseController vs Mocking HttpContextBase pour créer des méthodes Get / Set
la source
Ma façon d'accéder aux sessions est d'écrire une classe d'assistance qui encapsule les différents noms de champs et leurs types. J'espère que cet exemple aidera:
la source
Excellentes réponses des gars, mais je vous déconseille de toujours vous fier à la session. C'est rapide et facile à faire, et cela fonctionnerait bien sûr, mais ce ne serait pas génial dans toutes les circonstances.
Par exemple, si vous rencontrez un scénario dans lequel votre hébergement n'autorise pas l'utilisation de session, ou si vous êtes sur une batterie de serveurs Web, ou dans l'exemple d'une application SharePoint partagée.
Si vous souhaitez une solution différente, vous pouvez envisager d'utiliser un conteneur IOC tel que Castle Windsor , en créant une classe de fournisseur en tant que wrapper, puis en conservant une instance de votre classe en utilisant le mode de vie par requête ou par session en fonction de vos besoins.
Le CIO veillerait à ce que la même instance soit renvoyée à chaque fois.
Plus compliqué oui, si vous avez besoin d'une solution simple, utilisez simplement la session.
Voici quelques exemples de mise en œuvre ci-dessous par intérêt.
En utilisant cette méthode, vous pouvez créer une classe de fournisseur du type:
Et enregistrez-le quelque chose comme:
la source
Vous pouvez utiliser ViewModelBase comme classe de base pour tous les modèles, cette classe se chargera d'extraire les données de la session
Vous pouvez écrire une méthode d'extension sur HttpContextBase pour gérer les données de session
Utilisez ceci comme ci-dessous dans le contrôleur
Le deuxième argument est facultatif, il sera utilisé pour remplir les données de session pour cette clé lorsque la valeur n'est pas présente dans la session.
la source