2010-09-26 14 views
6

Czy istnieje sposób, aby pozwolić TempData przechowywać w ciasteczku przeglądarki zamiast stanu sesji. Mam stan sesji wyłączony na mojej stronie.Sklep ASP.NET MVC TempData w Cookie

Dzięki.

+1

uwaga na ograniczenia wielkości plików cookie i wymagania serializacji! :) – bzlm

Odpowiedz

-1

na zaf,

spróbować do usuwania plików cookie:

public void DeleteCookie(string name) 
{ 
    DateTime now = DateTime.UtcNow; 
    string cookieKey = name; 
    var cookie = new HttpCookie(cookieKey, null) 
    { 
     Expires = now.AddDays(-1) 
    }; 
    HttpContext.Response.Cookies.Set(cookie); 
} 

Wykorzystanie:

DeleteCookie("__ControllerTempData"); 
+0

To też nie działa. Wygląda na to, że Response nie stosuje żadnych modyfikacji, one po prostu nie działają. To musi być błąd! Dzięki! –

+0

Bez obaw - mam nadzieję, że je posortujesz –

+0

-1: Ta odpowiedź nawet nie wspomina o TempData – JotaBe

3

Można określić własny niestandardowy TempDataProvider i zapisać go, aby zapisać go w danych tymczasowych.

Spójrz na tego blog post na przykład, gdy ktoś korzysta z usług niestandardowych TempData

+0

Proszę zobaczyć mój drugi wątek http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie –

1

używam następujący trochę klasy plik:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 
using System.Web; 
using System.Web.Mvc; 

/* 16-09-2010 
* pulled from Microsoft.Web.Mvc Futures 
* be careful in case future versions of the mvc dll incorporate this 
* 
*/ 

namespace yournamespace 
{ 
    public class CookieTempDataProvider : ITempDataProvider 
    { 
     internal const string TempDataCookieKey = "__ControllerTempData"; 
     readonly HttpContextBase _httpContext; 

     public CookieTempDataProvider(HttpContextBase httpContext) 
     { 
      if (httpContext == null) 
      { 
       throw new ArgumentNullException("httpContext"); 
      } 
      _httpContext = httpContext; 
     } 

     public HttpContextBase HttpContext 
     { 
      get 
      { 
       return _httpContext; 
      } 
     } 

     protected virtual IDictionary<string, object> LoadTempData(ControllerContext controllerContext) 
     { 
      HttpCookie cookie = _httpContext.Request.Cookies[TempDataCookieKey]; 
      if (cookie != null && !string.IsNullOrEmpty(cookie.Value)) 
      { 
       IDictionary<string, object> deserializedTempData = DeserializeTempData(cookie.Value); 

       cookie.Expires = DateTime.MinValue; 
       cookie.Value = string.Empty; 

       if (_httpContext.Response != null && _httpContext.Response.Cookies != null) 
       { 
        HttpCookie responseCookie = _httpContext.Response.Cookies[TempDataCookieKey]; 
        if (responseCookie != null) 
        { 
         cookie.Expires = DateTime.MinValue; 
         cookie.Value = string.Empty; 
        } 
       } 

       return deserializedTempData; 
      } 

      return new Dictionary<string, object>(); 
     } 

     protected virtual void SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) 
     { 
      var cookieValue = SerializeToBase64EncodedString(values); 

      var cookie = new HttpCookie(TempDataCookieKey) 
          { 
           HttpOnly = true, Value = cookieValue 
          }; 

      _httpContext.Response.Cookies.Add(cookie); 
     } 

     public static IDictionary<string, object> DeserializeTempData(string base64EncodedSerializedTempData) 
     { 
      var bytes = Convert.FromBase64String(base64EncodedSerializedTempData); 
      var memStream = new MemoryStream(bytes); 
      var binFormatter = new BinaryFormatter(); 
      return binFormatter.Deserialize(memStream, null) as IDictionary<string, object>; 
     } 

     public static string SerializeToBase64EncodedString(IDictionary<string, object> values) 
     { 
      var memStream = new MemoryStream(); 
      memStream.Seek(0, SeekOrigin.Begin); 
      var binFormatter = new BinaryFormatter(); 
      binFormatter.Serialize(memStream, values); 
      memStream.Seek(0, SeekOrigin.Begin); 
      var bytes = memStream.ToArray(); 
      return Convert.ToBase64String(bytes); 
     } 

     IDictionary<string, object> ITempDataProvider.LoadTempData(ControllerContext controllerContext) 
     { 
      return LoadTempData(controllerContext); 
     } 

     void ITempDataProvider.SaveTempData(ControllerContext controllerContext, IDictionary<string, object> values) 
     { 
      SaveTempData(controllerContext, values); 
     } 
    } 
} 

a następnie dodać go do mojego contoller jako takie:

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
     TempDataProvider = new CookieTempDataProvider(requestContext.HttpContext); 
    } 

wydaje się działać prawidłowo ...

+0

Mam ten sam kod, który pochodzi z kontraktów futures. W każdym razie chciałbym usunąć plik cookie z odpowiedzi, ale to nie działa dla mnie. Czy mogę sprawdzić mój drugi wątek http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie –

+0

Nazaf - opublikuję poniżej metodę używaną do usuwania plików cookie (nie dotyczy tempdata, ale powinno działać) –

Powiązane problemy