Je ne suis pas sûr si vous cherchez à maintenir une référence à l'objet pour la session d'un utilisateur entier ou si vous ne le souhaitez que pour une seule requête. De toute façon, vous pouvez utiliser le Global.asax pour obtenir l'objet dans le périmètre de vos contrôleurs et vues à utiliser:
En premier lieu, une demande objet scope:
Global.asax.cs:
protected void Application_BeginRequest(object sender, EventArgs e)
{
var myObject = SomeMethodThatGetsMyObject();
HttpContext.Current.Items.Add("MyObjectKey", myObject);
}
protected void Application_EndRequest(object sender, EventArgs e)
{
HttpContext.Current.Items.Remove("MyObjectKey");
}
Ensuite, dans les contrôleurs, vous pouvez accéder à cette façon:
public ViewResult ThisAction()
{
var myObject = HttpContext.Current.Items["MyObjectKey"] as MyObjectType;
// placing this in view data provides easy access in the view.
ViewData["MyObject"] = myObject;
return View();
}
Ensuite, dans les vues que vous pouvez y accéder depuis la ViewData ou directl y de la HttpContext
<% var myObject = ViewData["MyObject"] as MyObjectType; %>
<!-- If for some reason you don't want it in view data
you can use the HttpContext directly instead -->
<% var myObject = HttpContext.Current.Items["MyObjectKey"] as MyObjectType; %>
En second lieu, une session objet scope:
Cette méthode permet de garder l'objet de portée jusqu'à ce que les extrémités de la session de l'utilisateur.
Global.asax.cs
protected void Session_Start(object sender, EventArgs e)
{
var myObject = SomeMethodThatGetsMyObject();
Session["MyObjectKey"] = myObject;
}
protected void Session_End(object sender, EventArgs e)
{
Session.Remove("MyObjectKey");
}
Ensuite, dans les contrôleurs, vous pouvez accéder à cette façon:
public ViewResult ThisAction()
{
var myObject = Session["MyObjectKey"] as MyObjectType;
// placing this in view data provides easy access in the view.
ViewData["MyObject"] = myObject;
return View();
}
Ensuite, dans les vues que vous pouvez y accéder depuis la ViewData, ou directement à partir du HttpContext
<% var myObject = ViewData["MyObject"] as MyObjectType; %>
<!-- If for some reason you don't want it in view data
you can use the Session directly instead -->
<% var myObject = Session["MyObjectKey"] as MyObjectType; %>
Meilleures pratiques
Il convient de mentionner que certaines meilleures pratiques pourraient être appliquées pour améliorer un peu cette conception. Pour un, au lieu de passer et d'utiliser un objet entier dans votre vue, il est généralement préférable de simplement passer les valeurs dont vous avez besoin dans les données de vue en gardant la vue libre de l'attribution et du code de coulée.(souvenez-vous que si vous allez projeter dans votre vue, vous allez avoir à gérer le potentiel que la distribution échoue aussi dans votre vue!)
De plus, le désir d'avoir un objet utilisateur est toujours disponible " juste au cas où "est un peu d'anti-pattern. Il peut être utile de savoir quel est le but de cet objet afin de suggérer un modèle approprié pour aider à résoudre votre problème selon les meilleures pratiques connues. J'espère que quelque part dans ce que j'ai pu aider un peu.
Je ne sais pas si cela est exactement ce que vous vouliez dire, mais ce genre de chose est un SessionFacade. Exemple ici: http://www.codeproject.com/KB/aspnet/session_facade.aspx –