2012-06-10 2 views
1

Я хочу определить значение cookie как переменную класса в методе конструктора, чтобы все методы были доступны для использования Cookie.Asp.net MVC3, используя конструктор

, но я получил сообщение об ошибке, как,

Ссылка на объект не указывает на экземпляр объекта.

public class OrdersController : Controller 
{ 
    string userData; 

    public orderConroller(){ 
     string cookieName = FormsAuthentication.FormsCookieName; 
      HttpCookie authCookie = Request.Cookies[cookieName]; 
     FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
      userData = authTicket.UserData; 
    } 

    public void a(){ 
     //I need Cookie 
    } 
    public void b(){ 
     //I need Cookie 
    } 
    public void c(){ 
     //I need Cookie 
    } 
    public void d(){ 
     //I need Cookie 
    } 
} 

Как решить эту проблему? @. @

Спасибо!

ответ

6

Вы не можете использовать HttpContext (в вашем случае вы пытаетесь получить доступ к объекту Request) внутри конструктора контроллера, поскольку он еще не инициализирован. Самый ранний метод, к которому вы могли получить доступ, - это метод Initialize, который вы можете переопределить.

Итак:

public class OrdersController : Controller 
{ 
    private string userData; 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
     var request = requestContext.HttpContext.Request; 
     string cookieName = FormsAuthentication.FormsCookieName; 
     HttpCookie authCookie = request.Cookies[cookieName]; 
     FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
     userData = authTicket.UserData; 
    } 

    public void a() { 
     //I need Cookie 
    } 
    public void b() { 
     //I need Cookie 
    } 
    public void c() { 
     //I need Cookie 
    } 
    public void d() { 
     //I need Cookie 
    } 
} 
+0

большое спасибо! ~ –

0

Я вижу вашу потребность в печенье составляет около аутентификации. Для аутентификации лучшим способом будет использование настраиваемого фильтра авторизации. Фильтр может инициализировать объект User со всей необходимой информацией. Путь более элегантный, чем этот код внутри конструктора.

0

Вы можете сделать пользовательские данные доступны ленивым способом:

public class OrdersController : Controller 
{ 
    private string userData; 
    private string UserData { 
     get { 
      if(userData == null) { 
       var request = requestContext.HttpContext.Request; 
       string cookieName = FormsAuthentication.FormsCookieName; 
       HttpCookie authCookie = request.Cookies[cookieName]; 
       FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 
       userData = authTicket.UserData; 
      } 
      return userData; 
     } 
    } 
... 
} 

Тогда в своих действиях вы просто вызовите UserData свойство. Таким образом, вы не будете выполнять этот код в любом запросе, но только в тех, которые нуждаются в пользовательских данных (учитывая, что вы дешифруете вещи, вы можете избежать этого в каждом запросе, если вам не нужно).

Надеюсь, это поможет.