J'écris une application Web qui permettra à un utilisateur de naviguer vers plusieurs pages Web au sein du site Web en effectuant certaines requêtes. Toutes les informations que l'utilisateur saisit seront stockées dans un objet que j'ai créé. Le problème est que cet objet doit être 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ù dois-je déclarer une variable de session ? Existe-t-il un autre moyen ?
Réponses
Trop de publicités?Je pense que vous devriez vous demander si les choses ont vraiment leur place dans un état de session. C'est quelque chose que je me retrouve à 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 des choses dans le contexte de la session. Tout ne devrait pas être là simplement parce qu'il appartient à un utilisateur.
dans le hook global.asax l'événement OnSessionStart
void OnSessionStart(...)
{
HttpContext.Current.Session.Add("__MySessionObject", new MySessionObject());
}
Partout 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.
public static MySessionObject GetMySessionObject(this HttpContext current)
{
return current != null ? (MySessionObject)current.Session["__MySessionObject"] : null;
}
De cette façon, vous pouvez en code
void OnLoad(...)
{
var sessionObj = HttpContext.Current.GetMySessionObject();
// do something with 'sessionObj'
}
La réponse est correcte, mais j'ai eu du mal à la mettre en œuvre dans une application ASP.NET MVC 3. Je voulais accéder à un objet Session dans un contrôleur et je n'arrivais pas à comprendre pourquoi je continuais à obtenir une erreur "Instance not set to an instance of an Object". Ce que j'ai remarqué, c'est que lorsque j'ai essayé d'accéder à la session dans un contrôleur en faisant ce qui suit, j'ai continué à obtenir cette erreur. Cela est dû au fait que this.HttpContext fait partie de l'objet Controller.
this.Session["blah"]
// or
this.HttpContext.Session["blah"]
Cependant, ce que je voulais, c'était le HttpContext qui fait partie de l'espace de nom 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 :
System.Web.HttpContext.Current.Session["blah"]
ça m'a aidé, je ne suis pas sûr d'avoir fait quelque chose qui n'est pas dans les habitudes ici, mais j'espère que ça aidera quelqu'un !
Parce que je n'aime pas voir "HTTPContext.Current.Session" partout, j'utilise un modèle singleton pour accéder aux variables de session, ce qui vous donne un sac de données fortement typé et facile d'accès.
[Serializable]
public sealed class SessionSingleton
{
#region Singleton
private const string SESSION_SINGLETON_NAME = "Singleton_502E69E5-668B-E011-951F-00155DF26207";
private SessionSingleton()
{
}
public static SessionSingleton Current
{
get
{
if ( HttpContext.Current.Session[SESSION_SINGLETON_NAME] == null )
{
HttpContext.Current.Session[SESSION_SINGLETON_NAME] = new SessionSingleton();
}
return HttpContext.Current.Session[SESSION_SINGLETON_NAME] as SessionSingleton;
}
}
#endregion
public string SessionVariable { get; set; }
public string SessionVariable2 { get; set; }
// ...
alors vous pouvez accéder à vos données de n'importe où :
SessionSingleton.Current.SessionVariable = "Hello, World!";
Si vous utilisez asp.net mvc, voici un moyen simple d'accéder à la session.
Depuis un contrôleur :
{Controller}.ControllerContext.HttpContext.Session["{name}"]
D'un point de vue :
<%=Session["{name}"] %>
Ce n'est certainement pas la meilleure façon d'accéder à vos variables de session, mais c'est une voie directe. Utilisez-la donc avec précaution (de préférence lors d'un prototypage rapide), et utilisez un Wrapper/Container et OnSessionStart lorsque c'est approprié.
HTH
Eh bien, IMHO
- ne jamais référencer une session à l'intérieur de votre page de vue/master
- minimiser votre utilisation de la Session. MVC fournit l'obj TempData pour cela, qui est essentiellement une session qui ne vit que pour un seul voyage vers le serveur.
En ce qui concerne le point 1, j'ai une vue principale fortement typée qui possède une propriété permettant d'accéder à 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 souplesse en ce qui concerne les pages de vue fortement typées.
ViewMasterPage<AdminViewModel>
AdminViewModel
{
SomeImportantObjectThatWasInSession ImportantObject
}
AdminViewModel<TModel> : AdminViewModel where TModel : class
{
TModel Content
}
et puis...
ViewPage<AdminViewModel<U>>