2010-09-13 22 views
8

Bir ASP.NET MVC Uygulamasında bir ControllerBase sınıfım var. Diğer denetleyiciler ControllerBase'dan devralır.HttpContext.Current.User, ControllerBase (asp.net mvc) 'de boştur.

HttpContext.User.Identity.Name'a erişmek istiyorum, ancak HttpContextnull. Sorun ne? senin ControllerBase bu etkinliğe katılmak üzere kod ekleyerek

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

cevap

11

Dene:

protected override void Initialize(RequestContext requestContext){ 

} 
+1

Bu geçersiz kılma içinde base.Initialize (requestContext) çağrısı yapmam gerektiğini keşfettim, aksi halde bir NullReferenceException alırdım. – HitLikeAHammer

5

Kişisel kontrolör HttpContext önce inşa alır ASP.NET tarafından kurulmuştur. Nik'in dediği gibi, bu kodu sınıfınızda geçersiz kılınan bir yönteme koymanız gerekir.

Ayrıca, HttpContext'e bağlı olarak doğrudan, bu sınıfı genişleten herhangi bir denetleyicinizde birim sınamasını gerçekleştirmeyi imkansız kılacağınızı da belirtmek isterim. Bu nedenle, ControllerBase sınıfındaki birçok yöntem (Execute yöntemi gibi) bir argüman olarak RequestContext alır. Sen söyleyebiliriz:

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

... oluşturmak ve birim test amaçlı "sahte" bağlamlar ile Denetleyicilerinizi yürütmek mümkün kılar.