2010-09-13 96 views
8

我在ASP.NET MVC应用程序中有一个ControllerBase类。其他控制器继承自ControllerBaseHttpContext.Current.User在ControllerBase中为空(asp.net mvc)

我想访问HttpContext.User.Identity.Name,但HttpContextnull。怎么了?

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

回答

11

尝试增加你的代码,这一事件在您的ControllerBase:

protected override void Initialize(RequestContext requestContext){ 

} 
+1

我发现我需要在这个覆盖内调用base.Initialize(requestContext),否则我会在稍后得到一个NullReferenceException。 – HitLikeAHammer 2013-04-15 18:34:03

5

你的控制器得到的HttpContext之前建造已被ASP.NET设置。就像Nik说的那样,你需要把这段代码放到你班上的重写方法中。

我还要指出,直接依赖于HttpContext将无法在扩展此类的任何控制器上执行单元测试。这就是为什么ControllerBase类中的许多方法(如Execute方法)以RequestContext作为参数。你可以说:

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

...这使得它可以创建并与单元测试目的,“假的”上下文执行你的控制器。

相关问题