2010-09-13 32 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; 
    ... 
} 

...這使得它可以創建並與單元測試目的,「假的」上下文執行你的控制器。

相關問題