2009-08-22 8 views
0

Pour le moment, je remplace l'événement OnLoad d'un ASP.NET ViewPage. Pour qu'un objet puisse être partagé avec toutes les pages d'affichage. Mais je dois maintenant pouvoir accéder à cet objet dans le contrôleur aussi; Quelle est la meilleure façon de le faire? Essentiellement, je veux partager un objet (qui est unique pour chaque utilisateur de l'application web ... donc singleton est sorti) avec les pages vues et les contrôleurs.Comment partager un objet entre des contrôleurs et des pages d'affichage?

Merci!

Répondre

1

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.

0

Mettez-le dans une classe de base de vos contrôleurs? Honnêtement, votre conception semble imparfaite ... une sorte d '"objet divin" a trouvé sa place dans votre conception. Si vous demandez un meilleur moyen de faire ce que vous faites, vous obtiendrez peut-être de meilleures réponses ...

0

Il semble que vous vouliez transmettre certaines variables de session à vos vues. La meilleure façon d'y parvenir est peut-être de créer une classe de modèle de vue de base qui charge ces informations à partir de l'objet de session pour vous. Cet objet de base peut ensuite être utilisé pour construire les classes de modèle de vue personnalisées pour chaque vue.

+0

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 –

0

Je suis d'accord avec Will. Collez l'objet dans une classe de contrôleur de base dont dérivent vos contrôleurs principaux.

regarder ici pour voir ce que les autres disent >>ViewModel-Best-Practices

Questions connexes