2010-09-13 33 views
8

Ich habe eine ControllerBase Klasse in einer ASP.NET MVC-Anwendung. Die anderen Controller erben von ControllerBase.HttpContext.Current.User ist null in ControllerBase (asp.net mvc)

Ich möchte auf HttpContext.User.Identity.Name zugreifen, aber HttpContext ist null. Was ist los?

public ControllerBase() 
     { 
      var dataManager=new DataManager(); 
      if (HttpContext.User.Identity.IsAuthenticated) // throws error 
      {      
       ViewData["assets"] = ud.BalanceFreeze + ud.Balance + ud.BalanceRealty; 
       ViewData["onaccount"] = ud.Balance; 
       ViewData["pending"] = ud.BalanceFreeze; 
       ViewData["inrealty"] = ud.BalanceRealty; 
      } 

Antwort

11

versuchen, Ihren Code zu diesem Ereignis in Ihrem Controller Zusatz:

protected override void Initialize(RequestContext requestContext){ 

} 
+1

Ich entdeckte, dass ich base.Initialize (requestContext) innerhalb dieser Überschreibung aufrufen musste, sonst würde ich später eine NullReferenceException bekommen. – HitLikeAHammer

5

Ihre Controller vor dem Httpcontext aufgebaut wird durch ASP.NET gesetzt wurde. Wie Nik sagt, müssen Sie diesen Code in eine überschriebene Methode in Ihrer Klasse einfügen.

Ich würde auch darauf hinweisen, dass abhängig von HttpContext direkt macht es unmöglich, Unit-Tests auf einem Ihrer Controller, die diese Klasse zu erweitern. Dies ist der Grund, warum viele der Methoden (wie die Execute-Methode) in der Klasse RequestContext als Argument verwenden. Sie können sagen:

protected override void Execute(System.Web.Routing.RequestContext requestContext) 
{ 
    var currentUser = requestContext.HttpContext.User; 
    ... 
} 

... die es ermöglicht, Ihre Controller mit „fake“ Kontexte für Einheit Testzwecken zu erstellen und auszuführen.

Verwandte Themen