2010-09-13 2 views
8

У меня есть класс ControllerBase в приложении ASP.NET MVC. Другие контроллеры наследуют от ControllerBase.HttpContext.Current.User имеет значение null в ControllerBase (asp.net mvc)

Я хочу получить HttpContext.User.Identity.Name, но HttpContext is null. Что случилось?

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

5

Ваш контроллер получает построен до HttpContext установлен ASP.NET. Как говорит Ник, вам нужно поместить этот код в переопределенный метод в своем классе.

Я также хотел бы указать, что в зависимости от HttpContext напрямую будет невозможно выполнить модульное тестирование на любом из ваших контроллеров, расширяющих этот класс. Вот почему многие из методов (например, метод Execute) в классе ControllerBase принимают аргумент RequestContext. Вы можете сказать:

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

... что позволяет создавать и выполнять свои контроллеры с «фальшивыми» контекстами для целей модульного тестирования.

Смежные вопросы