2012-06-10 45 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

我看你需要的cookie是關於認證。對於身份驗證,最好的方法是使用自定義授權過濾器。過濾器可以用所有需要的信息初始化用戶對象。比在構造函數中使用此代碼更優雅。

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財產。這樣,您不會在任何請求中執行該代碼,而只需要那些需要用戶數據的代碼(考慮到您正在解密事物,如果不需要,您可能希望在每個請求中避免這樣做)。

希望它有幫助。