2010-09-13 23 views
8

Tengo una clase ControllerBase en una aplicación ASP.NET MVC. Los otros controladores heredan de ControllerBase.HttpContext.Current.User es nulo en ControllerBase (asp.net mvc)

Quiero acceder HttpContext.User.Identity.Name, pero HttpContext es null. ¿Qué pasa?

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; 
      } 

Respuesta

11

intente añadir el código a este evento en su ControllerBase:

protected override void Initialize(RequestContext requestContext){ 

} 
+1

Descubrí que necesitaba llamar a base.Initialize (requestContext) dentro de esta anulación, de lo contrario recibiría una NullReferenceException más tarde. – HitLikeAHammer

5

Su controlador se construyó antes de la HttpContext se ha establecido por ASP.NET. Como dice Nik, necesitas poner este código en un método anulado en tu clase.

También me gustaría señalar que depender de HttpContext directamente hará imposible realizar pruebas de unidades en cualquiera de sus controladores que amplíen esta clase. Esta es la razón por la cual muchos de los métodos (como el método Execute) en la clase ControllerBase toman un RequestContext como argumento. Se puede decir:

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

... lo que hace que sea posible crear y ejecutar sus controladores con contextos "falsos" para propósitos de prueba unidad.

Cuestiones relacionadas