2011-07-23 84 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);