2011-07-23 53 views
18

我试图实现我的应用程序的基本cookie的帮手。 主要是每次检查基本控制器是否设置cookie。 如果饼干ASP.NET MVC Cookie实施

public class MyCookie 
{ 

    public static string CookieName {get;set;} 
    public virtual User User { get; set; } 
    public virtual Application App { get; set; } 


    public MyCookie(Application app) 
    { 
     CookieName = "MyCookie" + app; 
     App = app; 
    } 

    public void SetCookie(User user) 
    { 
     HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName); 
     myCookie.Values["UserId"] = user.UserId.ToString(); 
     myCookie.Values["LastVisit"] = DateTime.Now.ToString(); 
     myCookie.Expires = DateTime.Now.AddDays(365); 
     HttpContext.Current.Response.Cookies.Add(myCookie); 
    } 

    public HttpCookie GetCookie() 
    { 
     HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName]; 
     if(myCookie != null) 
     { 
      int userId = Convert.ToInt32(myCookie.Values["UserId"]); 
      User user = session.Get<User>(userId); 
      return user; 
     } 
     return null; 
    } 
} 

如果会话是空我试图从cookie来获得,或者如果会话初始化我设置Cookie,但我从来没有看到我的浏览器cookie。哪里不对?

我总是开始会话,但用户id = 0 从饼干帮助获取Cookie,并设置会话:

if (userId == 0) 
{ 
    MyCookie myCookie = new MyCookie(_app); 
    User user = cookieHelper.GetCookie(); 
    if (user != null) 
     SessionHelper.SetSession(user); 
} 
+5

你的代码看起来不错我。你可以发布你调用它的代码吗? –

+4

新的片段('if(userId == 0)')在哪里?你把这些代码放在哪里?什么控制器方法等?另外,你为什么在下面使用'CookieHelper',并在上面使用'MyCookie'?为什么一个'GetCookie'方法返回一个'HttpCookie',但是当你调用另一个'GetCookie'方法时,它会返回'User'。我很困惑。 –

+2

我总是初始化基本控制器中的会话。如果没有用户登录,我使用用户ID 0设置会话。Actuallu两个都是MyCookie。但是因为我在编辑问题的同时我的代码已更改。因为我在等待来自stackoverflow的答案时尝试了一些东西。 – gandil

回答

14

我的工作实现(基本版)

public class CookieHelper 
{ 

public static string CookieName {get;set;} 
public virtual Application App { get; set; } 


public MyCookie(Application app) 
{ 
    CookieName = "MyCookie" + app; 
} 

public static void SetCookie(User user, Community community, int cookieExpireDate = 30) 
{ 
    HttpCookie myCookie= new HttpCookie(CookieName); 
    myCookie["UserId"] = user.UserId.ToString(); 
    myCookie.Expires = DateTime.Now.AddDays(cookieExpireDate); 
    HttpContext.Current.Response.Cookies.Add(myCookie); 
} 
} 

如果会话/ Cookie是空(实际上是用户id = 0)

if (userId == 0){ 
    CookieHelper myCookie = new Cookie(_app); 
    if (myCookie != null) 
    { 
     userId = Convert.ToInt32(System.Web.HttpContext.Current.Request.Cookies[myCookie.CookieName]["userId"]); 
     if(userId>0) 
     { 
      SessionHelper.SetSession(userId); 
     } 
    } 
} 
19

你不能设置和获取在同一请求中的cookie。获取cookie会从浏览器中获取,但尚未得到它 - 设置一个cookie会将其作为标题的一部分在请求完成时发回。

您需要设置Cookie,并让浏览器重定向可能在其他地方(例如,从/登录/帐户),然后在新的请求读它会显示正确的饼干。

编辑: 如果猜测是错误的,我也会问你在哪里实际调用.SetCookie(),因为你提供的代码中没有任何地方是你实际调用它来创建cookie。

调试这些事情,我觉得好带你承担应该工作的代码位,测试它们。例如在我输入的新页面的page_load中:

string CookieName = "bob"; 
long UserId = 4; 
HttpCookie myCookie = HttpContext.Current.Request.Cookies[CookieName] ?? new HttpCookie(CookieName); 
myCookie.Values["UserId"] = UserId.ToString(); 
myCookie.Values["LastVisit"] = DateTime.Now.ToString(); 
myCookie.Expires = DateTime.Now.AddDays(365); 
HttpContext.Current.Response.Cookies.Add(myCookie); 

并且cookie正确显示没有问题。因此,了解这段代码实际上确实我们可以假设错误的工作不会被调用或功能调试你currentlying做的是试图设置在同一请求读取cookie和失败(因为我本来规定)

测试/

无论哪种方式祝你好运!

+1

同意!一旦浏览器发送了请求,您就只能读取cookie。我一直是这样的问题的受害者...但我想了一分钟:) ..我来自1999年的PHP学校:) – effkay

1

试试这个

HttpCookie cookie = new HttpCookie("Remember_Me"); 
cookie["userID"] = Userid.ToString(); 
cookie.Expires = DateTime.Now.AddMonths(3); 
Response.Cookies.Add(cookie);