2010-09-26 3 views
6

Есть ли способ оставить TempData в cookie браузера вместо состояния сеанса. У меня отключено состояние сеанса на моем сайте.ASP.NET MVC Store TempData в Cookie

Спасибо.

+1

Остерегайтесь ограничений размера файлов cookie и требований к сериализуемости! :) – bzlm

ответ

-1

Na ZAF,

попробовать это для удаления куки:

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

использование:

DeleteCookie("__ControllerTempData"); 
+0

Это тоже не сработало. Кажется, что Response не применяет никаких изменений, они просто не вступают в силу. Это должно быть ошибка! Спасибо в любом случае! – 2010-09-30 04:31:50

+0

не беспокоится - надеюсь, что вы его отсортировали –

+0

-1: В этом ответе даже не упоминается TempData – JotaBe

3

Вы можете указать свой собственный TempDataProvider и записать его так, чтобы он хранился в данных temp.

Взгляните на этой blog post для примера, в котором кто-то использует пользовательский поставщик TempData

+0

См. Мою другую тему http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie – 2010-09-29 02:19:28

1

я использую следующий маленький файл класса:

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

, а затем добавить его в мой регулятор, как таковые:

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

, кажется, работает хорошо ...

+0

У меня есть тот же код, который взят из сборщика фьючерсов. Во всяком случае, я хотел бы удалить cookie из Response, но он не работает для меня. Можете ли вы проверить мою другую тему http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie – 2010-09-29 02:20:32

+0

Nazaf - я опубликую ниже метод, который я использую для удаления файлов cookie (не относится к tempdata, но должен работать) –

5

Вы можете использовать Брок поставщика Cookie TempData Аллена. Is fully documented here, а также available as a NuGet package.

Он принимает во внимание, между прочим, важную проблему: безопасность.

Это действительно легко сделать, чтобы MVC TempData использовал этот пакет.

+0

Он не играет хорошо с обновлениями MVC, только с 3 до 5.1 – regisbsb

 Смежные вопросы

  • Нет связанных вопросов^_^