2012-04-16 5 views
1

Я создал ApplicationController.cs, который наследует все остальные контроллеры. Я пытаюсь использовать этот контроллер, чтобы захватить полное имя пользователя из БД, установить в ViewBag & захват в layout.cshtml.MVC3 - Получить информацию из базы данных и заполнить в layout.cshtml

Я также создал переменную сеанса в Global.asax, которая фиксирует логин пользователя. Моя проблема в том, что переменная Session имеет значение null в ApplicationController.cs. Однако переменная сеанса заполняется должным образом во всех дочерних контроллерах. Вот мой ApplicationController.cs код:

public abstract class ApplicationController : Controller 
{ 
    private SkadPROEntities db = new SkadPROEntities(); 

    public SkadPROEntities SkadProDB 
    { 
     get { return db; }     
    } 


    public ApplicationController() 
    { 
     //string[] currentUserString = User.Identity.Name.Split('\\'); 
     //string myCurrentUser = currentUserString[1]; 
     //string myCurrentUser = Session["currentUser"].ToString(); 
     var empQuery = from employee in db.PRO_LSN_EMPLOYEE_OBJ 
         //where employee.LSN_Security_Nbr == Session["currentUser"].ToString() 
         where employee.LSN_Security_Nbr == "bhopkins" 
         select employee; 
     string firstName = ""; 
     foreach (var myEmployee in empQuery) 
     { 
      firstName = myEmployee.LSN_cf_First_Name; 
     } 
     ViewBag.FirstName = firstName; 
     ViewBag.EmpName = "Bill Test"; 
    } 
} 

Почему сессия переменная нуль в ApplicationController.cs, но заселена во всех детских контроллерах?

ответ

1

Вы не можете получить доступ к переменным сеанса в конструкторах. Предположительно, вы пытаетесь получить доступ к переменной сеанса в действиях ваших дочерних конструкторов, а не их конструкторов.

См Session null in ASP.Net MVC Controller Constructors

+0

Есть ли у вас какие-либо рекомендации в отношении инъекционного информации данных на странице макета? Я думал, что пройти через базовый контроллер будет лучше, но мне нужно получить доступ к переменной сеанса. – user1336495

+0

@ user1336495 Я думаю, что базовый контроллер должен отображать данные страницы макета. Вы можете переопределить метод OnActionExecuting и получить его там. Тем не менее, мне не нравится использовать ViewBag в макетах. Я бы назвал «@ Html.Action» в макете, чтобы вы могли получить отдельное действие для извлечения данных. – DMulligan

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