2012-06-10 46 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财产。这样,您不会在任何请求中执行该代码,而只需要那些需要用户数据的代码(考虑到您正在解密事物,如果不需要,您可能希望在每个请求中避免这样做)。

希望它有帮助。