Esiste un modo per consentire a TempData di memorizzare nel cookie di un browser anziché in Stato sessione. Ho disabilitato lo stato della sessione sul mio sito.ASP.NET MVC Store TempData in Cookie
Grazie.
Esiste un modo per consentire a TempData di memorizzare nel cookie di un browser anziché in Stato sessione. Ho disabilitato lo stato della sessione sul mio sito.ASP.NET MVC Store TempData in Cookie
Grazie.
Na ZAF,
Prova questo per rimuovere i 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);
}
utilizzo:
DeleteCookie("__ControllerTempData");
Non ha funzionato neanche. Sembra che la risposta non applichi alcuna modifica, semplicemente non hanno effetto. Questo deve essere un bug! Grazie comunque! –
non ti preoccupare - spero di averlo risolto –
-1: questa risposta non menziona nemmeno TempData – JotaBe
È possibile specificare il proprio TempDataProvider personalizzato e scriverlo in modo che venga archiviato nei dati temporanei.
Date un'occhiata a questo blog post per un esempio in cui qualcuno utilizza un provider TempData personalizzato
Si prega di vedere il mio altro thread http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie –
Io uso il seguente file di classe poco:
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);
}
}
}
e poi aggiungerlo alla mia contoller come tale:
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
base.Initialize(requestContext);
TempDataProvider = new CookieTempDataProvider(requestContext.HttpContext);
}
sembra funzionare bene ...
Ho lo stesso codice che è preso da Assembly di futures. Ad ogni modo, vorrei rimuovere il cookie da Response, ma non funziona per me. Puoi controllare il mio altro thread http://stackoverflow.com/questions/3809379/asp-net-mvc-tempdata-in-browser-cookie –
Nazaf - inserirò qui sotto il metodo che uso per rimuovere i cookie (non specifico per tempdata ma dovrebbe funzionare) –
È possibile utilizzare Brock fornitore Cookie TempData di Allen. Is fully documented here ed è anche available as a NuGet package.
Prende in considerazione, tra le altre cose, un'importante preoccupazione: la sicurezza.
È molto semplice rendere MVC TempData utilizzare questo pacchetto.
Non funziona con gli aggiornamenti MVC, solo con 3 a 5.1 – regisbsb
Attenzione alle limitazioni della dimensione dei cookie e ai requisiti di serializzabilità! :) – bzlm