1

我想在构造方法中定义一个 cookie 值作为类变量,以使所有方法都可以使用 Cookie。

但我收到一条错误消息,例如,

你调用的对象是空的。

 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
    }
}

我怎么解决这个问题?@.@

谢谢!

4

3 回答 3

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
    }
}
于 2012-06-10T20:29:54.433 回答
0

我看到您对 cookie 的需求与身份验证有关。对于身份验证,最好的方法是使用自定义授权过滤器。过滤器可以使用所需的所有信息初始化用户对象。比在构造函数中包含此代码更优雅。

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

希望能帮助到你。

于 2012-06-10T22:44:30.177 回答