91 votes

Session null dans ASP.Net MVC Contrôleur de Constructeurs

Pourquoi est-Session null dans le constructeur des Contrôleurs? Il peut être consulté à partir de méthodes d'Action. Sans doute, parce que le MVC framework de Routage est responsable de newing-un Contrôleur, il n'a tout simplement pas (re-)instancié de la Session à ce point.

Personne ne sait si cela est voulu par la conception et, si oui, pourquoi?

[J'ai réussi à contourner le problème en utilisant un Modèle de Chargement différée.]

82voto

Andrew W Points 414

Andrei est de droite c'est nul parce que lors de l'exécution en vertu de la ASP.NET framework MVC, le HttpContext (et donc HttpContext.Session) n'est pas définie lorsque le contrôleur de classe est créé comme vous vous en doutez, mais c'set ("injecté"), plus tard, par la ControllerBuilder classe. Si vous voulez une meilleure compréhension du cycle de vie, vous pouvez tirer vers le bas la ASP.NET framework MVC (la source est disponible), ou référez-vous à: cette page

Si vous avez besoin d'accéder à la Session alors un moyen serait de remplacer la "OnActionExecuting" méthode d'accès et il y, car il sera disponible en ce moment.

Cependant, comme Andrei suggère, si votre code est tributaire de la Session alors qu'il pourrait être difficile d'écrire des tests unitaires, alors peut-être que vous pourriez envisager d'emballage de la Séance dans une classe d'assistance qui peuvent ensuite être échangé pour un autre, non version web lors de l'exécution en vertu de tests unitaires, donc de couplage de votre contrôleur à partir du web.

66voto

Mike Chamberlain Points 5325

En plus des autres réponses, en Controller.Session n'est pas renseignée dans le constructeur, vous pouvez toujours accéder à la session par l'intermédiaire de:

System.Web.HttpContext.Current.Session

avec le standard de l'inconvénient que cela pourrait réduire votre contrôleur de test.

11voto

Andrei Rînea Points 7554

La Session est injecté plus tard dans le cycle de vie. Pourquoi avez-vous besoin de la session dans le constructeur de toute façon? Si vous en avez besoin pour le TDD vous devez envelopper la séance, dans un mockable objet.

8voto

Funlover Points 11

Vous pouvez remplacer la méthode Initialize pour définir votre session.

protected override void Initialize(RequestContext requestContext)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X