Ik ben nieuw met ASP.NET MVC. Ik heb eerder PHP gebruikt en het was eenvoudig om een sessie te maken en gebruikersrecords te selecteren op basis van de huidige sessievariabelen.
Ik heb overal op het Internet gezocht naar een eenvoudige stap-voor-stap tutorial die me kan laten zien hoe ik sessies kan maken en gebruiken in mijn C# ASP.NET MVC 4 applicatie. Ik wil een sessie maken met gebruikersvariabelen die ik overal in mijn controllers kan benaderen en de variabelen kan gebruiken in mijn LINQ queries.
-Dank bij voorbaat!
Probeer
//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;
Door de stateloze aard van het web zijn sessies ook een uiterst nuttige manier om objecten te bewaren tussen verschillende verzoeken door ze te serialiseren en op te slaan in een sessie.
Een perfecte toepassing hiervan zou kunnen zijn dat je regelmatig informatie moet opvragen over je applicatie, om extra database-aanroepen bij elk verzoek te besparen, deze gegevens kunnen worden opgeslagen in een object en bij elk verzoek worden gedeserialiseerd, zoals dit:
Onze herbruikbare, serializable object:
[Serializable]
public class UserProfileSessionData
{
public int UserId { get; set; }
public string EmailAddress { get; set; }
public string FullName { get; set; }
}
Use case:
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 */
}
}
Eens dit object geserialiseerd is, kunnen we het in alle controllers gebruiken zonder dat we het moeten aanmaken of de database opnieuw moeten bevragen voor de gegevens die het bevat.
Injecteer je sessie object met behulp van Dependency Injection
In een ideale wereld zou je 'programma naar een interface, niet implementatie' en injecteer uw serializable sessie object in uw controller met behulp van uw Inversion of Control container van keuze, zoals zo (dit voorbeeld maakt gebruik van StructureMap als het's degene die ik'ben het meest vertrouwd met).
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;
}
}
Je zou dit dan registreren in je Global.asax.cs
bestand.
Voor degenen die niet bekend zijn met het injecteren van sessie-objecten, is er een meer diepgaande blog post over het onderwerp hier.
Een waarschuwing:
Het is de moeite waard om op te merken dat sessies tot een minimum beperkt moeten worden, grote sessies kunnen prestatieproblemen gaan veroorzaken.
Het wordt ook aanbevolen om er geen gevoelige gegevens in op te slaan (wachtwoorden, enz.).
Dit is hoe session state werkt in ASP.NET en ASP.NET MVC:
ASP.NET Session State Overview
In principe doe je dit om een waarde op te slaan in het Session object:
Session["FirstName"] = FirstNameTextBox.Text;
Om de waarde op te halen:
var firstName = Session["FirstName"];