Sono nuovo di ASP.NET MVC. Ho usato PHP prima ed è stato facile creare una sessione e selezionare i record utente in base alle variabili di sessione correnti.
Ho cercato ovunque su Internet un semplice tutorial passo dopo passo che mi mostri come creare e usare le sessioni nella mia applicazione C# ASP.NET MVC 4. Voglio creare una sessione con variabili utente a cui posso accedere da qualsiasi punto dei miei controller ed essere in grado di utilizzare le variabili nelle mie query LINQ.
-Grazie in anticipo!
Prova
//adding data to session
//assuming the method below will return list of Products
var products=Db.GetProducts();
//Store the products to a session
Session["products"]=products;
//To get what you have stored to a session
var products=Session["products"] as List<Product>;
//to clear the session value
Session["products"]=null;
A causa della natura apolide del web, le sessioni sono anche un modo estremamente utile per persistere gli oggetti attraverso le richieste, serializzandoli e memorizzandoli in una sessione.
Un perfetto caso d'uso di questo potrebbe essere se avete bisogno di accedere a informazioni regolari attraverso la vostra applicazione, per risparmiare ulteriori chiamate al database su ogni richiesta, questi dati possono essere memorizzati in un oggetto e non serializzati su ogni richiesta, così:
Il nostro oggetto riutilizzabile e serializzabile:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Caso d'uso:
public class LoginController : Controller {
[HttpPost]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
var profileData = new UserProfileSessionData {
UserId = model.UserId,
EmailAddress = model.EmailAddress,
FullName = model.FullName
}
this.Session["UserProfile"] = profileData;
}
}
public ActionResult LoggedInStatusMessage()
{
var profileData = this.Session["UserProfile"] as UserProfileSessionData;
/* From here you could output profileData.FullName to a view and
save yourself unnecessary database calls */
}
}
Una volta che questo oggetto è stato serializzato, possiamo usarlo in tutti i controllori senza doverlo creare o interrogare nuovamente il database per i dati contenuti al suo interno.
Iniettare l'oggetto di sessione usando Dependency Injection
In un mondo ideale si dovrebbe 'programmare su un'interfaccia, non su un'implementazione' e iniettare il proprio oggetto di sessione serializzabile nel controller usando il proprio contenitore di Inversione del Controllo di scelta, in questo modo (questo esempio usa StructureMap perché è quello con cui sono più familiare).
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
this.For<IUserProfileSessionData>().HybridHttpOrThreadLocalScoped().Use(() => GetUserProfileFromSession());
}
public static IUserProfileSessionData GetUserProfileFromSession()
{
var session = HttpContext.Current.Session;
if (session["UserProfile"] != null)
{
return session["UserProfile"] as IUserProfileSessionData;
}
/* Create new empty session object */
session["UserProfile"] = new UserProfileSessionData();
return session["UserProfile"] as IUserProfileSessionData;
}
}
Dovresti quindi registrarlo nel tuo file Global.asax.cs
.
Per coloro che non hanno familiarità con l'iniezione di oggetti di sessione, è possibile trovare un post più approfondito sul blog sull'argomento qui.
Una parola di avvertimento:
Vale la pena notare che le sessioni dovrebbero essere mantenute al minimo, sessioni di grandi dimensioni possono iniziare a causare problemi di prestazioni.
Si raccomanda inoltre di non memorizzare dati sensibili in esse (password, ecc.).
Ecco come funziona lo stato di sessione in ASP.NET e ASP.NET MVC:
Panoramica sullo stato di sessione in ASP.NET
Fondamentalmente, si fa questo per memorizzare un valore nell'oggetto Session:
Session["FirstName"] = FirstNameTextBox.Text;
Per recuperare il valore:
var firstName = Session["FirstName"];